springboot整合websocket實(shí)現(xiàn)群聊思路代碼詳解
實(shí)現(xiàn)思路

發(fā)送者向服務(wù)器發(fā)送大家早上好。其它客戶端可以收到對應(yīng)消息。
項(xiàng)目展示

通過springboot引入websocket,實(shí)現(xiàn)群聊,通過在線websocket測試進(jìn)行展示。
核心代碼
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關(guān)閉連接@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); // 生產(chǎn)環(huán)境下,請?jiān)O(shè)置成 debug 級別
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
WebSocketUtil.removeSession (session);
WebSocketUtil.broadcast (session.getId ()+"下線了");
log.info("[onClose][session({}) 連接關(guān)閉。關(guān)閉原因是({})}]", session, closeReason);
}
@OnError
public void onError(Session session, Throwable throwable) {
log.info("[onClose][session({}) 發(fā)生異常]", session, throwable);
}
}
WebSocketUtil工具類
@Slf4j
public class WebSocketUtil
{
// ========== 會話相關(guān) ==========
/**
* 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 ());
}
// ========== 消息相關(guān) ==========
/**
* 廣播發(fā)送消息給所有在線用戶
*
* @param message 消息體
* @param <T> 消息類型
*/
public static <T extends Message> void broadcast(String message) {
// 創(chuàng)建消息
// String messageText = buildTextMessage(type, message);
// 遍歷 SESSION_USER_MAP ,進(jìn)行逐個發(fā)送
for (String sessionId : SESSION_USER_MAP.keySet()) {
sendTextMessage(SESSION_USER_MAP.get (sessionId), message);
}
}
/**
* 發(fā)送消息給單個用戶的 Session
*
* @param session Session
* @param type 消息類型
* @param message 消息體
* @param <T> 消息類型
*/
public static <T extends Message> void send(Session session, String type, T message) {
// 創(chuàng)建消息
String messageText = buildTextMessage(type, message);
// 遍歷給單個 Session ,進(jìn)行逐個發(fā)送
sendTextMessage(session, messageText);
}
/**
* 構(gòu)建完整的消息
*
* @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();
}
/**
* 真正發(fā)送消息
*
* @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({}) 發(fā)送消息{}) 發(fā)生異常",
session, messageText, e);
}
}
}
在線websocket調(diào)試輸入ws://localhost:8080/即可。
以上就是springboot整合websocket實(shí)現(xiàn)群聊思路代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于springboot整合websocket的資料請關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn)代碼
- SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼
- SpringBoot整合websocket實(shí)現(xiàn)即時通信聊天
- 使用springboot整合websocket實(shí)現(xiàn)群聊教程
- springboot整合websocket最基礎(chǔ)入門使用教程詳解
- Springboot之整合Socket連接案例
- SpringBoot2.0整合WebSocket代碼實(shí)例
- 通過實(shí)例講解springboot整合WebSocket
- Springboot整合Socket實(shí)現(xiàn)單點(diǎn)發(fā)送,廣播群發(fā),1對1,1對多實(shí)戰(zhàn)
相關(guān)文章
SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密的操作代碼
Jasypt(Java?Simplified?Encryption)是一個專注于簡化Java加密操作的開源工具,它提供了一種簡單而強(qiáng)大的方式來處理數(shù)據(jù)的加密和解密,使開發(fā)者能夠輕松地保護(hù)應(yīng)用程序中的敏感信息,本文給大家介紹了SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密,需要的朋友可以參考下2024-05-05
Java中RabbitMQ的幾種消息確認(rèn)機(jī)制
RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文主要介紹了Java中RabbitMQ的幾種消息確認(rèn)機(jī)制,具有一定的參考價值,感興趣的可以了解一下2023-12-12
Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn)
這篇文章主要介紹了Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java實(shí)現(xiàn)新建有返回值的線程的示例詳解
本文主要介紹了一個Java多線程的例題,題目是:使用ThreadLocal管理一號和二號線程,分別存入100元,在三號線程中使用利用一號和二號的計(jì)算結(jié)果來算出賬戶的實(shí)際金額。感興趣的可以了解一下2022-09-09
Spring 中@Validated 分組校驗(yàn)的使用解析
這篇文章主要介紹了Spring 中@Validated 分組校驗(yàn)的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

