springboot整合websocket实现群聊思路代码详解
程序员文章站
2022-03-03 09:41:29
实现思路发送者向服务器发送大家早上好。其它客户端可以收到对应消息。项目展示通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示。核心代码pom引入jar&l...
实现思路
发送者向服务器发送大家早上好
。其它客户端可以收到对应消息。
项目展示
通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示。
核心代码
pom引入jar
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.3.10.release</version> <relativepath/> <!-- lookup parent from repository --> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-lang3</artifactid> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.12</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-websocket</artifactid> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>1.2.62</version> </dependency> </dependencies>
使用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 map<string, session> session_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 <t> 消息类型 */ public static <t extends message> 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 <t> 消息类型 */ public static <t extends message> void send(session session, string type, t message) { // 创建消息 string messagetext = buildtextmessage(type, message); // 遍历给单个 session ,进行逐个发送 sendtextmessage(session, messagetext); } /** * 构建完整的消息 * * @param type 消息类型 * @param message 消息体 * @param <t> 消息类型 * @return 消息 */ private static <t extends message> 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/
即可。
以上就是springboot整合websocket实现群聊思路代码详解的详细内容,更多关于springboot整合websocket的资料请关注其它相关文章!