springboot整合websocket實現(xiàn)群聊思路代碼詳解
更新時間:2021年05月28日 15:05:11 作者:叁滴水
通過springboot引入websocket,實現(xiàn)群聊,通過在線websocket測試進行展示。本文重點給大家介紹springboot整合websocket實現(xiàn)群聊功能,代碼超級簡單,感興趣的朋友跟隨小編一起學習吧
實現(xiàn)思路

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

通過springboot引入websocket,實現(xiàn)群聊,通過在線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); // 生產環(huán)境下,請設置成 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({}) 發(fā)生異常]", 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 ());
}
// ========== 消息相關 ==========
/**
* 廣播發(fā)送消息給所有在線用戶
*
* @param message 消息體
* @param <T> 消息類型
*/
public static <T extends Message> void broadcast(String message) {
// 創(chuàng)建消息
// String messageText = buildTextMessage(type, message);
// 遍歷 SESSION_USER_MAP ,進行逐個發(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 ,進行逐個發(fā)送
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();
}
/**
* 真正發(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調試輸入ws://localhost:8080/即可。
以上就是springboot整合websocket實現(xiàn)群聊思路代碼詳解的詳細內容,更多關于springboot整合websocket的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:
- SpringBoot整合WebSocket的客戶端和服務端的實現(xiàn)代碼
- SpringBoot整合Netty實現(xiàn)WebSocket的示例代碼
- SpringBoot整合websocket實現(xiàn)即時通信聊天
- 使用springboot整合websocket實現(xiàn)群聊教程
- springboot整合websocket最基礎入門使用教程詳解
- Springboot之整合Socket連接案例
- SpringBoot2.0整合WebSocket代碼實例
- 通過實例講解springboot整合WebSocket
- Springboot整合Socket實現(xiàn)單點發(fā)送,廣播群發(fā),1對1,1對多實戰(zhàn)
相關文章
SpringBoot整合jasypt進行重要數(shù)據(jù)加密的操作代碼
Jasypt(Java?Simplified?Encryption)是一個專注于簡化Java加密操作的開源工具,它提供了一種簡單而強大的方式來處理數(shù)據(jù)的加密和解密,使開發(fā)者能夠輕松地保護應用程序中的敏感信息,本文給大家介紹了SpringBoot整合jasypt進行重要數(shù)據(jù)加密,需要的朋友可以參考下2024-05-05

