springboot整合websocket最基礎(chǔ)入門使用教程詳解
項(xiàng)目最終的文件結(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;
/**
* 標(biāo)識當(dāng)前連接客戶端的用戶名
*/
private String name;
/**
* 用于存所有的連接服務(wù)的客戶端,這個對象存儲是安全的
* 注意這里的kv,設(shè)計(jì)的很巧妙,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] 連接成功,當(dāng)前連接人數(shù)為:={}",webSocketSet.size());
log.info("----------------------------------");
log.info("");
GroupSending(name+" 來了");
}
/**
* 連接關(guān)閉調(diào)用的方法
*/
@OnClose
public void OnClose(){
webSocketSet.remove(this.name);
log.info("[WebSocket] 退出成功,當(dāng)前連接人數(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實(shí)現(xiàn)消息推送的示例代碼
- springboot整合websocket后啟動報錯(javax.websocket.server.ServerContainer not available)
- SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法
- Springboot整合WebSocket實(shí)戰(zhàn)教程
- SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn)代碼
- SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼
- 通過實(shí)例講解springboot整合WebSocket
- SpringBoot3整合WebSocket詳細(xì)指南
相關(guān)文章
SpringBoot淺析安全管理之Spring Security配置
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置2022-08-08
關(guān)于@RequestBody和@RequestParam注解的使用詳解
這篇文章主要介紹了關(guān)于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯誤的地方還望不吝賜教2023-03-03
Spring?boot?RedisTemplate?序列化服務(wù)化配置方式
這篇文章主要介紹了Springboot?RedisTemplate序列化服務(wù)化配置方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
Springboot整合mybatisplus時,使用條件構(gòu)造器排序報錯問題及解決
這篇文章主要介紹了Springboot整合mybatisplus時,使用條件構(gòu)造器排序報錯問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
java二維數(shù)組實(shí)現(xiàn)推箱子小游戲
這篇文章主要為大家詳細(xì)介紹了java二維數(shù)組實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11
Spring Boot實(shí)現(xiàn)郵件注冊功能示例代碼
本篇文章主要介紹了Spring Boot實(shí)現(xiàn)郵件注冊功能示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Centos中yum方式安裝java的實(shí)現(xiàn)示例
這篇文章主要介紹了Centos中yum方式安裝java的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

