springboot整合websocket如何实现群聊

这篇文章将为大家详细讲解有关springboot整合websocket如何实现群聊,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

实现思路

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如何实现群聊”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2021-05-30 14:10:36
收藏
分享
海报
0 条评论
173
上一篇:NAS利用Docker容器如何搭建KMS激活服务器实现激活windows系统和office 下一篇:css中怎么给字体加描边
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码