这篇“SpringBoot怎么实现WebSocket即时通讯”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot怎么实现WebSocket即时通讯”文章吧。
1、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.3</version></dependency>
2、WebSocketConfig 开启WebSocket
package com.shucha.deveiface.web.config; import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); }}
3、WebSocketServer
package com.shucha.deveiface.web.ws; import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework.web.socket.WebSocketSession; import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CopyOnWriteArraySet; @Component@ServerEndpoint("/webSocket/{userId}")@Slf4jpublic class WebSocketServer { private Session session; private String userId; private static int onlineCount = 0; private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>(); private static ConcurrentHashMap<String,WebSocketServer> webSocketMap = new ConcurrentHashMap(); private final static List<Session> SESSIONS = Collections.synchronizedList(new ArrayList<>()); @OnOpen public void onOpen(Session session, @PathParam("userId") String userId) { this.session = session; this.userId = userId; webSocketSet.add(this); SESSIONS.add(session); if (webSocketMap.containsKey(userId)) { webSocketMap.remove(userId); webSocketMap.put(userId,this); } else { webSocketMap.put(userId,this); addOnlineCount(); } // log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size()); log.info("[连接ID:{}] 建立连接, 当前连接数:{}", this.userId, webSocketMap.size()); } @OnClose public void onClose() { webSocketSet.remove(this); if (webSocketMap.containsKey(userId)) { webSocketMap.remove(userId); subOnlineCount(); } // log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size()); log.info("[连接ID:{}] 断开连接, 当前连接数:{}", userId, webSocketMap.size()); } @OnError public void onError(Session session, Throwable error) { log.info("[连接ID:{}] 错误原因:{}", this.userId, error.getMessage()); error.printStackTrace(); } @OnMessage public void onMessage(String message) { // log.info("【websocket消息】收到客户端发来的消息:{}", message); log.info("[连接ID:{}] 收到消息:{}", this.userId, message); } public void sendMessage(String message,Long userId) { WebSocketServer webSocketServer = webSocketMap.get(String.valueOf(userId)); if (webSocketServer!=null){ log.info("【websocket消息】推送消息, message={}", message); try { webSocketServer.session.getBasicRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); log.error("[连接ID:{}] 发送消息失败, 消息:{}", this.userId, message, e); } } } public void sendMassMessage(String message) { try { for (Session session : SESSIONS) { if (session.isOpen()) { session.getBasicRemote().sendText(message); log.info("[连接ID:{}] 发送消息:{}",session.getRequestParameterMap().get("userId"),message); } } } catch (Exception e) { e.printStackTrace(); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } }
4、测试连接发送和接收消息
package com.shucha.deveiface.web.controller; import com.alibaba.fastjson.JSONObject;import com.shucha.deveiface.web.ws.WebSocketServer;import lombok.Data;import lombok.experimental.Accessors;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping("/web")public class TestWebSocket { @Autowired private WebSocketServer webSocketServer; @GetMapping("/test") public void test(){ for (int i=1;i<4;i++) { WebsocketResponse response = new WebsocketResponse(); response.setUserId(String.valueOf(i)); response.setUserName("姓名"+ i); response.setAge(i); webSocketServer.sendMessage(JSONObject.toJSONString(response), Long.valueOf(String.valueOf(i))); } } @GetMapping("/sendMassMessage") public void sendMassMessage(){ WebsocketResponse response = new WebsocketResponse(); response.setUserName("群发消息模板测试"); webSocketServer.sendMassMessage(JSONObject.toJSONString(response)); } @Data @Accessors(chain = true) public static class WebsocketResponse { private String userId; private String userName; private int age; }}
5、在线测试地址
websocket 在线测试
6、测试截图
访问测试发送消息:http://localhost:50041//web/test
测试访问地址:ws://192.168.0.115:50041/webSocket/1 wss://192.168.0.115:50041/webSocket/2
以上就是关于“SpringBoot怎么实现WebSocket即时通讯”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。