构建即时通讯应用:Spring boot高效集成WebSocket、Stomp协议完成前后端持 ...

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

1. 引入依靠

在你的Spring Boot项目的pom.xml中添加以下依靠:
  1. <dependencies>
  2.         <!-- Spring Boot Starter Thymeleaf -->
  3.         <dependency>
  4.             <groupId>org.springframework.boot</groupId>
  5.             <artifactId>spring-boot-starter-thymeleaf</artifactId>
  6.         </dependency>
  7.         <!-- Spring Boot Starter WebSocket -->
  8.         <dependency>
  9.             <groupId>org.springframework.boot</groupId>
  10.             <artifactId>spring-boot-starter-websocket</artifactId>
  11.         </dependency>
  12.         <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  13.         <dependency>
  14.             <groupId>com.fasterxml.jackson.core</groupId>
  15.             <artifactId>jackson-databind</artifactId>
  16.         </dependency>
  17.         <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
  18.         <dependency>
  19.             <groupId>com.fasterxml.jackson.core</groupId>
  20.             <artifactId>jackson-core</artifactId>
  21.         </dependency>
  22.         <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
  23.         <dependency>
  24.             <groupId>com.fasterxml.jackson.core</groupId>
  25.             <artifactId>jackson-annotations</artifactId>
  26.         </dependency>
  27.     </dependencies>
复制代码
2. 设置WebSocket

创建一个设置类来设置WebSocket毗连端点、STOMP协议和消息传输路径:
  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebsocketMessageBrokerConfig implements WebSocketMessageBrokerConfigurer {
  4.     @Override
  5.     public void registerStompEndpoints(StompEndpointRegistry registry) {
  6.         registry.addEndpoint("/ws") // WebSocket握手端口
  7.                 .setAllowedOriginPatterns("*") // 设置跨域
  8.                 .withSockJS(); // 开启SockJS回退机制
  9.     }
  10.     @Override
  11.     public void configureMessageBroker(MessageBrokerRegistry registry) {
  12.         registry.setApplicationDestinationPrefixes("/app") // 发送到服务端目的地前缀
  13.                 .enableSimpleBroker("/topic");// 开启简单消息代理,指定消息订阅前缀
  14.     }
  15. }
复制代码
3. 创建消息处理惩罚器

创建一个控制器来处理惩罚客户端发送的消息,并将消息广播给订阅了相关主题的客户端:
  1. /**
  2. * 功能描述:
  3. *
  4. * @author Songxianyang
  5. * @date 2024-08-05 17:24
  6. */
  7. @Controller
  8. @Slf4j
  9. @RequiredArgsConstructor
  10. public class StompController {
  11.     private final SimpMessagingTemplate messagingTemplate;
  12.     @GetMapping("stomp")
  13.     public ModelAndView stomp() {
  14.         return new ModelAndView("stomp");
  15.     }
  16.     /**
  17.      * 数据通过前端发送到后端,处理完数据后在响应给前端的订阅者“/topic/public”
  18.      * @param chatMessage
  19.      * @return
  20.      */
  21.     // 这个注解的作用是映射客户端发送到服务器的消息路径
  22.     @MessageMapping("/chat.sendMessage")
  23.     @SendTo("/topic/public")
  24.     public ChatMessage sendMessage(ChatMessage chatMessage) {
  25.         return chatMessage;
  26.     }
  27.     @MessageMapping("/chat.addUser")
  28.     @SendTo("/topic/public")
  29.     public ChatMessage addUser(ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
  30.         // 将用户名存储在WebSocket会话中
  31.         headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
  32.         return chatMessage;
  33.     }
  34.     /**
  35.      * 服务端主动给客户端发送消息
  36.      * @return
  37.      */
  38.     @GetMapping("s-to-c")
  39.     @SendTo("/topic/public")
  40.     @ResponseBody
  41.     public ChatMessage sToC() {
  42.         ChatMessage chatMessage = new ChatMessage();
  43.         chatMessage.setContent("西瓜视频");
  44.         chatMessage.setSender("Server");
  45.         chatMessage.setType(ChatMessage.MessageType.CHAT);
  46.         // 发送消息
  47.         messagingTemplate.convertAndSend("/topic/public", chatMessage);
  48.         return chatMessage;
  49.     }
  50.     @GetMapping("/html/greeting")
  51.     public ModelAndView turnToGreetingPage() {
  52.         return new ModelAndView("greeting");
  53.     }
  54.     @MessageMapping("/greeting")
  55.     public String sayGreeting(String name) {
  56.         log.info("Message received: {}", name);
  57.         return "Hello, " + name;
  58.     }
  59. }
复制代码
4. 创建消息模型

创建一个简单的Java类来表示聊天消息:
  1. /**
  2. * 聊天消息对象
  3. */
  4. @Data
  5. public class ChatMessage {
  6.     /**
  7.      * 消息的类型
  8.      */
  9.     private MessageType type;
  10.     /**
  11.      * 消息的内容
  12.      */
  13.     private String content;
  14.     /**
  15.      * 发送者
  16.      */
  17.     private String sender;
  18.     public enum MessageType {
  19.         //普通聊天消息
  20.         CHAT,
  21.         // 加入聊天
  22.         JOIN,
  23.         // 离开聊天
  24.         LEAVE
  25.     }
  26. }
复制代码
5. 创建前端代码(stomp.html)

在前端(例如使用HTML和JavaScript)中集成WebSocket和STOMP。以下是一个简单的示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>WebSocket-Chat-stomp</title>
  5.     <script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.6.1/sockjs.min.js"></script>
  6.     <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
  7.     <script>
  8.         var stompClient = null;
  9.         // 接收消息
  10.         function connect() {
  11.             var socket = new SockJS('/ws');
  12.             stompClient = Stomp.over(socket);
  13.             stompClient.connect({}, function (frame) {
  14.                 console.log('Connected: ' + frame);
  15.                 // 客户端订阅服务端消息
  16.                 stompClient.subscribe('/topic/public', function (message) {
  17.                     showMessage(JSON.parse(message.body));
  18.                 });
  19.             });
  20.         }
  21.         // 发送消息
  22.         function sendMessage() {
  23.             var messageContent = document.getElementById("message").value;
  24.             // 往客户端发送消息
  25.             stompClient.send("/app/chat.sendMessage", {}, JSON.stringify({
  26.                 sender: "User",
  27.                 content: messageContent,
  28.                 type: 'CHAT'
  29.             }));
  30.         }
  31.         // 展示消息
  32.         function showMessage(message) {
  33.             var response = document.getElementById("response");
  34.             var p = document.createElement("p");
  35.             p.appendChild(document.createTextNode(message.sender + ": " + message.content));
  36.             response.appendChild(p);
  37.         }
  38.         // 用户加入
  39.         function addUser() {
  40.             var userName = document.getElementById('username').value;
  41.             if (userName && stompClient) {
  42.                 var chatMessage = {
  43.                     sender: userName,
  44.                     content: userName + "已加入聊天!请注意财产安全",
  45.                     type: 'JOIN'
  46.                 };
  47.                 stompClient.send("/app/chat.addUser", {}, JSON.stringify(chatMessage));
  48.             }
  49.         }
  50.     </script>
  51. </head>
  52. <body onload="connect()">
  53. <div>
  54.     <input type="text" id="username" placeholder="Enter your name" />
  55.     <button onclick="addUser()">用户加入</button>
  56.     <input type="text" id="message" />
  57.     <button onclick="sendMessage()">发送信息</button>
  58. </div>
  59. <div id="response"></div>
  60. </body>
  61. </html>
复制代码
7. yml设置

  1. server:
  2.   port: 9999
  3. #  servlet:
  4. #    context-path: /demo
  5. spring:
  6.   freemarker:
  7.     request-context-attribute: request
  8.     suffix: .html
  9.     content-type: text/html
  10.     enabled: true
  11.     cache: false
  12.     charset: UTF-8
  13.     allow-request-override: false
  14.     expose-request-attributes: true
  15.     expose-session-attributes: true
  16.     expose-spring-macro-helpers: true
复制代码
8. 运行应用步伐

启动Spring Boot应用步伐,并打开你的HTML页面,你应该能够通过WebSocket毗连发送和接收消息了。
毗连http://localhost:9999/stomphttp://localhost:9999/stomp 1.前端


2.用户加入


3.聊天消息


4.服务端主动给客户端发送消息




总结

通过以上步骤,你可以在Spring Boot项目中集成WebSocket和STOMP协议,实现实时的双向通信功能。这是一个根本的示例,你可以根据须要进行扩展和自定义,例如添加更多的消息处理惩罚逻辑、安全认证等。
源码

持续更新 (集群、优化这个应用)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表