springboot整合websocket最基礎(chǔ)入門使用教程詳解
項目最終的文件結(jié)構(gòu)

1 添加maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
2 編寫配置類 WebSocketConfig
package cn.huawei.socket_test_1.config;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Component
public class WebSocketConfig {
/**
* ServerEndpointExporter 作用
*
* 這個Bean會自動注冊使用@ServerEndpoint注解聲明的websocket endpoint
*
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3 編寫核心業(yè)務(wù)類 WebSocket
package cn.huawei.socket_test_1.websock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;
/**
* @ServerEndpoint 注解的作用
*
* @ServerEndpoint 注解是一個類層次的注解,它的功能主要是將目前的類定義成一個websocket服務(wù)器端,
* 注解的值將被用于監(jiān)聽用戶連接的終端訪問URL地址,客戶端可以通過這個URL來連接到WebSocket服務(wù)器端
*/
@Slf4j
@Component
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
/**
* 與某個客戶端的連接對話,需要通過它來給客戶端發(fā)送消息
*/
private Session session;
/**
* 標識當前連接客戶端的用戶名
*/
private String name;
/**
* 用于存所有的連接服務(wù)的客戶端,這個對象存儲是安全的
* 注意這里的kv,設(shè)計的很巧妙,v剛好是本類 WebSocket (用來存放每個客戶端對應(yīng)的MyWebSocket對象)
*/
private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>();
/**
* 連接建立成功調(diào)用的方法
* session為與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
*/
@OnOpen
public void OnOpen(Session session, @PathParam(value = "name") String name){
log.info("----------------------------------");
this.session = session;
this.name = name;
// name是用來表示唯一客戶端,如果需要指定發(fā)送,需要指定發(fā)送通過name來區(qū)分
webSocketSet.put(name,this);
log.info("[WebSocket] 連接成功,當前連接人數(shù)為:={}",webSocketSet.size());
log.info("----------------------------------");
log.info("");
GroupSending(name+" 來了");
}
/**
* 連接關(guān)閉調(diào)用的方法
*/
@OnClose
public void OnClose(){
webSocketSet.remove(this.name);
log.info("[WebSocket] 退出成功,當前連接人數(shù)為:={}",webSocketSet.size());
GroupSending(name+" 走了");
}
/**
* 收到客戶端消息后調(diào)用的方法
*/
@OnMessage
public void OnMessage(String message_str){
log.info("[WebSocket] 收到消息:{}",message_str);
//判斷是否需要指定發(fā)送,具體規(guī)則自定義
//message_str的格式 TOUSER:user2;message:aaaaaaaaaaaaaaaaaa;
if(message_str.indexOf("TOUSER") == 0){
//取出 name和message的值
String[] split = message_str.split(";");
String[] split1 = split[0].split(":");
String[] split2 = split[1].split(":");
String name = split1[1];
String message = split2[1];
//指定發(fā)送
AppointSending(name,message);
}else{
//群發(fā)
GroupSending(message_str);
}
}
/**
* 發(fā)生錯誤時調(diào)用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
log.info("發(fā)生錯誤");
error.printStackTrace();
}
/**
* 群發(fā)
* @param message
*/
public void GroupSending(String message){
for (String name : webSocketSet.keySet()){
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 指定發(fā)送
* @param name
* @param message
*/
public void AppointSending(String name,String message){
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
4 因前端不熟悉,所以使用 http://coolaf.com/tool/chattest 在線測試
因代碼中 @ServerEndpoint("/websocket/{name}") 是這樣定義的,所以 通過下面的方式連接上去,測試群發(fā)和指定發(fā)送

因java代碼中這樣定義的消息,可以指定發(fā)送某個人,測試

到此這篇關(guān)于springboot整合websocket最基礎(chǔ)入門使用教程詳解的文章就介紹到這了,更多相關(guān)springboot整合websocket入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot3集成WebSocket的全過程
- SpringBoot整合Netty+Websocket實現(xiàn)消息推送的示例代碼
- springboot整合websocket后啟動報錯(javax.websocket.server.ServerContainer not available)
- SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細方法
- Springboot整合WebSocket實戰(zhàn)教程
- SpringBoot整合WebSocket的客戶端和服務(wù)端的實現(xiàn)代碼
- SpringBoot整合Netty實現(xiàn)WebSocket的示例代碼
- 通過實例講解springboot整合WebSocket
- SpringBoot3整合WebSocket詳細指南
相關(guān)文章
關(guān)于ResponseEntity類和HttpEntity及跨平臺路徑問題
這篇文章主要介紹了關(guān)于ResponseEntity類和HttpEntity及跨平臺路徑問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Java8中List轉(zhuǎn)換String字符串幾種方式
這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)換String字符串的幾種方式,在實際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,文中給出了幾種方法的示例代碼,需要的朋友可以參考下2023-07-07

