本篇文章小编给大家分享一下springboot整合websocket实现群聊代码解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
实现思路
发送者向服务器发送大家早上好。其它客户端可以收到对应消息。
项目展示
通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示。
核心代码
pom引入jar
org.springframework.boot spring-boot-starter-parent 2.3.10.RELEASE 1.8 org.springframework.boot spring-boot-starter-web org.apache.commons commons-lang3 org.projectlombok lombok 1.18.12 org.springframework.boot spring-boot-starter-websocket com.alibaba fastjson 1.2.62
使用springboot 2.3.10.RELEASE版本;java8
WebSocketConfig配置类
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
websocket有4个注解,解释如下
@OnOpen有新连接
@OnMessage有新消息时
@OnClose关闭连接
@OnError连接异常
对于这个4个注解,配置在方法上即可。
WebsocketServerEndpoint接收类
@Slf4j @Controller @ServerEndpoint ("/") public class WebsocketServerEndpoint { @OnOpen public void onOpen(Session session, EndpointConfig config) { log.info("[onOpen][session({}) 接入]", session); WebSocketUtil.broadcast (session.getId ()+"上线了"); WebSocketUtil.addSession (session); } @OnMessage public void onMessage(Session session, String message) { WebSocketUtil.broadcast (message); log.info("[onOpen][session({}) 接收到一条消息({})]", session, message); // 生产环境下,请设置成 debug 级别 } @OnClose public void onClose(Session session, CloseReason closeReason) { WebSocketUtil.removeSession (session); WebSocketUtil.broadcast (session.getId ()+"下线了"); log.info("[onClose][session({}) 连接关闭。关闭原因是({})}]", session, closeReason); } @OnError public void onError(Session session, Throwable throwable) { log.info("[onClose][session({}) 发生异常]", session, throwable); } }
WebSocketUtil工具类
@Slf4j public class WebSocketUtil { // ========== 会话相关 ========== /** * Session 与用户的映射 */ private static final MapSESSION_USER_MAP = new ConcurrentHashMap<> (); /** * 添加 Session 。在这个方法中,会添加用户和 Session 之间的映射 * * @param session Session */ public static void addSession(Session session) { // 更新 SESSION_USER_MAP SESSION_USER_MAP.put(session.getId (), session); } /** * 移除 Session 。 * * @param session Session */ public static void removeSession(Session session) { // 从 SESSION_USER_MAP 中移除 SESSION_USER_MAP.remove(session.getId ()); } // ========== 消息相关 ========== /** * 广播发送消息给所有在线用户 * * @param message 消息体 * @param 消息类型 */ public static void broadcast(String message) { // 创建消息 // String messageText = buildTextMessage(type, message); // 遍历 SESSION_USER_MAP ,进行逐个发送 for (String sessionId : SESSION_USER_MAP.keySet()) { sendTextMessage(SESSION_USER_MAP.get (sessionId), message); } } /** * 发送消息给单个用户的 Session * * @param session Session * @param type 消息类型 * @param message 消息体 * @param 消息类型 */ public static void send(Session session, String type, T message) { // 创建消息 String messageText = buildTextMessage(type, message); // 遍历给单个 Session ,进行逐个发送 sendTextMessage(session, messageText); } /** * 构建完整的消息 * * @param type 消息类型 * @param message 消息体 * @param 消息类型 * @return 消息 */ private static String buildTextMessage(String type, T message) { JSONObject messageObject = new JSONObject(); messageObject.put("type", type); messageObject.put("body", message); return messageObject.toString(); } /** * 真正发送消息 * * @param session Session * @param messageText 消息 */ private static void sendTextMessage(Session session, String messageText) { if (session == null) { log.error("[sendTextMessage][session 为 null]"); return; } RemoteEndpoint.Basic basic = session.getBasicRemote(); if (basic == null) { log.error("[sendTextMessage][session 的 为 null]"); return; } try { basic.sendText(messageText); } catch (IOException e) { log.error("[sendTextMessage][session({}) 发送消息{}) 发生异常", session, messageText, e); } } }
在线websocket调试输入ws://localhost:8080/即可。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整