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 作用 * * 這個(gè)Bean會(huì)自動(dòng)注冊(cè)使用@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 注解是一個(gè)類層次的注解,它的功能主要是將目前的類定義成一個(gè)websocket服務(wù)器端, * 注解的值將被用于監(jiān)聽用戶連接的終端訪問URL地址,客戶端可以通過(guò)這個(gè)URL來(lái)連接到WebSocket服務(wù)器端 */ @Slf4j @Component @ServerEndpoint("/websocket/{name}") public class WebSocket { /** * 與某個(gè)客戶端的連接對(duì)話,需要通過(guò)它來(lái)給客戶端發(fā)送消息 */ private Session session; /** * 標(biāo)識(shí)當(dāng)前連接客戶端的用戶名 */ private String name; /** * 用于存所有的連接服務(wù)的客戶端,這個(gè)對(duì)象存儲(chǔ)是安全的 * 注意這里的kv,設(shè)計(jì)的很巧妙,v剛好是本類 WebSocket (用來(lái)存放每個(gè)客戶端對(duì)應(yīng)的MyWebSocket對(duì)象) */ private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>(); /** * 連接建立成功調(diào)用的方法 * session為與某個(gè)客戶端的連接會(huì)話,需要通過(guò)它來(lái)給客戶端發(fā)送數(shù)據(jù) */ @OnOpen public void OnOpen(Session session, @PathParam(value = "name") String name){ log.info("----------------------------------"); this.session = session; this.name = name; // name是用來(lái)表示唯一客戶端,如果需要指定發(fā)送,需要指定發(fā)送通過(guò)name來(lái)區(qū)分 webSocketSet.put(name,this); log.info("[WebSocket] 連接成功,當(dāng)前連接人數(shù)為:={}",webSocketSet.size()); log.info("----------------------------------"); log.info(""); GroupSending(name+" 來(lái)了"); } /** * 連接關(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ā)生錯(cuò)誤時(shí)調(diào)用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ log.info("發(fā)生錯(cuò)誤"); 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 在線測(cè)試
因代碼中 @ServerEndpoint("/websocket/{name}") 是這樣定義的,所以 通過(guò)下面的方式連接上去,測(cè)試群發(fā)和指定發(fā)送
因java代碼中這樣定義的消息,可以指定發(fā)送某個(gè)人,測(cè)試
到此這篇關(guān)于springboot整合websocket最基礎(chǔ)入門使用教程詳解的文章就介紹到這了,更多相關(guān)springboot整合websocket入門內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot3集成WebSocket的全過(guò)程
- SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼
- springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(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的示例代碼
- 通過(guò)實(shí)例講解springboot整合WebSocket
- SpringBoot3整合WebSocket詳細(xì)指南
相關(guān)文章
SpringBoot淺析安全管理之Spring Security配置
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置2022-08-08關(guān)于@RequestBody和@RequestParam注解的使用詳解
這篇文章主要介紹了關(guān)于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯(cuò)誤的地方還望不吝賜教2023-03-03Spring?boot?RedisTemplate?序列化服務(wù)化配置方式
這篇文章主要介紹了Springboot?RedisTemplate序列化服務(wù)化配置方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決
這篇文章主要介紹了Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04java二維數(shù)組實(shí)現(xiàn)推箱子小游戲
這篇文章主要為大家詳細(xì)介紹了java二維數(shù)組實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11SpringBoot熱部署啟動(dòng)關(guān)閉流程詳解
Spring?Boot啟動(dòng)熱部署是一種技術(shù),它能讓開發(fā)者在不重啟應(yīng)用程序的情況下實(shí)時(shí)更新代碼。這樣可以提高開發(fā)效率,避免頻繁重啟應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-04-04Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼
本篇文章主要介紹了Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Centos中yum方式安裝java的實(shí)現(xiàn)示例
這篇文章主要介紹了Centos中yum方式安裝java的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04