ToB企服应用市场:ToB评测及商务社交产业平台

标题: [超详细]SpringBoot整合WebSocket [打印本页]

作者: 万有斥力    时间: 2023-9-2 07:29
标题: [超详细]SpringBoot整合WebSocket
1. 什么是WebSocket?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许在浏览器和服务器之间进行实时的、双向的通信。相对于传统的基于请求和响应的 HTTP 协议,WebSocket 提供了一种更有效、更实时的通信方式,适用于需要实时更新、实时通知和实时交互的应用。
WebSocket 的一些关键特点包括:
2. 代码实战

2.1 SpringBoot导入依赖

在pom.xml中导入以下依赖,版本由SpringBoot管理
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-websocket</artifactId>
  4. </dependency>
复制代码
2.2 创建配置类

创建WebSocketConfig配置类,并将其注入到Bean容器中
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  4. @Configuration
  5. public class WebSocketConfig {
  6.     @Bean
  7.     public ServerEndpointExporter serverEndpointExporter() {
  8.         return new ServerEndpointExporter();
  9.     }
  10. }
复制代码
2.3 创建WebSocketServer类

创建WebSocketServer类,并将其注入到Bean容器中
注意:@ServerEndpoint("/WebSocket"),该注解用于配置建立WebSocket连接的路径,可以按需修改。
该类一般拥有以下功能:
可以将该类理解为WebSocket生命周期中会调用的方法。
  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.stereotype.Component;
  3. import javax.websocket.*;
  4. import javax.websocket.server.ServerEndpoint;
  5. @Slf4j
  6. @Component
  7. @ServerEndpoint("/WebSocket")
  8. public class WebSocketServer {
  9.     private Session session;
  10.     @OnOpen
  11.     public void onOpen(Session session) {
  12.         this.session = session;
  13.         WebSocketManager.sentToUser(session, "WebSocket is connected!");
  14.         WebSocketManager.addWebSocketServer(this);
  15.         log.info("与SessionId:{}建立连接", session.getId());
  16.     }
  17.     @OnClose
  18.     public void onClose() {
  19.         WebSocketManager.removeWebSocketServer(this);
  20.         log.info("WebSocket连接关闭");
  21.     }
  22.     @OnMessage
  23.     public void onMessage(String message, Session session) {
  24.         log.info("来自SessionId:{}的消息:{}", session.getId(), message);
  25.     }
  26.     @OnError
  27.     public void onError(Session session, Throwable error) {
  28.         log.error("Session:{}的WebSocket发生错误", session.getId(), error);
  29.     }
  30.     public Session getSession() {
  31.         return session;
  32.     }
  33.     public String getSessionId() {
  34.         return session.getId();
  35.     }
  36. }
复制代码
2.4 创建WebSocketServer管理类

该类用于管理WebSocketServer(其实主要是管理Session),如果不需要发送消息给特定用户,那么无需创建该类,在WebSocketServer类中维护一个类变量即可。
  1. import lombok.extern.slf4j.Slf4j;
  2. import javax.websocket.Session;
  3. import java.util.concurrent.ConcurrentHashMap;
  4. import java.util.concurrent.CopyOnWriteArraySet;
  5. @Slf4j
  6. public class WebSocketManager {
  7.     private final static CopyOnWriteArraySet<WebSocketServer> webSocketServerSet = new CopyOnWriteArraySet<>();
  8.     private final static ConcurrentHashMap<String, WebSocketServer> webSocketServerMap = new ConcurrentHashMap<>();
  9.     public static void addWebSocketServer(WebSocketServer webSocketServer){
  10.         if (webSocketServer != null){
  11.             webSocketServerSet.add(webSocketServer);
  12.             webSocketServerMap.put(webSocketServer.getSessionId(), webSocketServer);
  13.         }
  14.     }
  15.     public static void removeWebSocketServer(WebSocketServer webSocketServer){
  16.         webSocketServerSet.remove(webSocketServer);
  17.         webSocketServerMap.remove(webSocketServer.getSessionId());
  18.     }
  19.     /**
  20.      * 通过SessionId发送消息给特定用户
  21.      * @param
  22.      * @param msg
  23.      */
  24.     public static void sentToUser(String sessionId, String msg){
  25.         Session session = webSocketServerMap.get(sessionId).getSession();
  26.         sentToUser(session, msg);
  27.     }
  28.     /**
  29.      * 通过Session发送消息给特定用户
  30.      * @param session
  31.      * @param msg
  32.      */
  33.     public static void sentToUser(Session session, String msg){
  34.         if (session == null){
  35.             log.error("不存在该Session,无法发送消息");
  36.             return;
  37.         }
  38.         session.getAsyncRemote().sendText(msg);
  39.     }
  40.     /**
  41.      * 发送消息给所有用户
  42.      * @param msg
  43.      */
  44.     public static void sentToAllUser(String msg){
  45.         for (WebSocketServer webSocketServer : webSocketServerSet) {
  46.             sentToUser(webSocketServer.getSession(), msg);
  47.         }
  48.         log.info("向所有用户发送WebSocket消息完毕,消息:{}", msg);
  49.     }
  50. }
复制代码
3. 测试

使用Postman等工具进行WebSocket连接,连接路径为WebSocket(与前文的@ServerEndpoint内容一致)。建立连接后会收到"WebSocket is connected!"
4. 后续完善

如果你的项目中有登录功能,那么应该在你的登录时将用户的Session记录下来。你可以将Session记录在本地缓存、Redis和Grava缓存等能够建立关联关系的地方。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4