springboot整合websocket如何实现群聊
这篇文章将为大家详细讲解有关springboot整合websocket如何实现群聊,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
实现思路
发送者向服务器发送大家早上好
。其它客户端可以收到对应消息。
项目展示
通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示。
核心代码
pom引入jar
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.10.RELEASE</version> <relativePath/><!--lookupparentfromrepository--> </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 publicclassWebSocketConfig { @Bean publicServerEndpointExporterserverEndpointExporter() { returnnewServerEndpointExporter(); } }
websocket有4个注解,解释如下
@OnOpen
有新连接@OnMessage
有新消息时@OnClose
关闭连接@OnError
连接异常
对于这个4个注解,配置在方法上即可。
WebsocketServerEndpoint接收类
@Slf4j @Controller @ServerEndpoint("/") publicclassWebsocketServerEndpoint { @OnOpen publicvoidonOpen(Sessionsession,EndpointConfigconfig){ log.info("[onOpen][session({})接入]",session); WebSocketUtil.broadcast(session.getId()+"上线了"); WebSocketUtil.addSession(session); } @OnMessage publicvoidonMessage(Sessionsession,Stringmessage){ WebSocketUtil.broadcast(message); log.info("[onOpen][session({})接收到一条消息({})]",session,message);//生产环境下,请设置成debug级别 } @OnClose publicvoidonClose(Sessionsession,CloseReasoncloseReason){ WebSocketUtil.removeSession(session); WebSocketUtil.broadcast(session.getId()+"下线了"); log.info("[onClose][session({})连接关闭。关闭原因是({})}]",session,closeReason); } @OnError publicvoidonError(Sessionsession,Throwablethrowable){ log.info("[onClose][session({})发生异常]",session,throwable); } }
WebSocketUtil工具类
@Slf4j publicclassWebSocketUtil { //==========会话相关========== /** *Session与用户的映射 */ privatestaticfinalMap<String,Session>SESSION_USER_MAP=newConcurrentHashMap<>(); /** *添加Session。在这个方法中,会添加用户和Session之间的映射 * *@paramsessionSession */ publicstaticvoidaddSession(Sessionsession){ //更新SESSION_USER_MAP SESSION_USER_MAP.put(session.getId(),session); } /** *移除Session。 * *@paramsessionSession */ publicstaticvoidremoveSession(Sessionsession){ //从SESSION_USER_MAP中移除 SESSION_USER_MAP.remove(session.getId()); } //==========消息相关========== /** *广播发送消息给所有在线用户 * *@parammessage消息体 *@param<T>消息类型 */ publicstatic<TextendsMessage>voidbroadcast(Stringmessage){ //创建消息 //StringmessageText=buildTextMessage(type,message); //遍历SESSION_USER_MAP,进行逐个发送 for(StringsessionId:SESSION_USER_MAP.keySet()){ sendTextMessage(SESSION_USER_MAP.get(sessionId),message); } } /** *发送消息给单个用户的Session * *@paramsessionSession *@paramtype消息类型 *@parammessage消息体 *@param<T>消息类型 */ publicstatic<TextendsMessage>voidsend(Sessionsession,Stringtype,Tmessage){ //创建消息 StringmessageText=buildTextMessage(type,message); //遍历给单个Session,进行逐个发送 sendTextMessage(session,messageText); } /** *构建完整的消息 * *@paramtype消息类型 *@parammessage消息体 *@param<T>消息类型 *@return消息 */ privatestatic<TextendsMessage>StringbuildTextMessage(Stringtype,Tmessage){ JSONObjectmessageObject=newJSONObject(); messageObject.put("type",type); messageObject.put("body",message); returnmessageObject.toString(); } /** *真正发送消息 * *@paramsessionSession *@parammessageText消息 */ privatestaticvoidsendTextMessage(Sessionsession,StringmessageText){ if(session==null){ log.error("[sendTextMessage][session为null]"); return; } RemoteEndpoint.Basicbasic=session.getBasicRemote(); if(basic==null){ log.error("[sendTextMessage][session的为null]"); return; } try{ basic.sendText(messageText); }catch(IOExceptione){ log.error("[sendTextMessage][session({})发送消息{})发生异常", session,messageText,e); } } }
在线websocket调试输入ws://localhost:8080/
即可。
关于“springboot整合websocket如何实现群聊”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
推荐阅读
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
springboot实现基于aop的切面日志
本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志...
-
SpringBoot定时任务功能怎么实现
-
SpringBoot中的@Import注解怎么使用
-
SpringBoot整合Lombok及常见问题怎么解决
-
springboot图片验证码功能模块怎么实现
-
Springboot+SpringSecurity怎么实现图片验证码登录
-
SpringBoot注解的知识点有哪些
SpringBoot注解的知识点有哪些这篇“SpringBoot注...
-
SpringBoot2.x中management.security.enabled=false无效怎么解决
-
springboot怎么禁用某项健康检查
springboot怎么禁用某项健康检查今天小编给大家分享一下sp...