Spring Boot 整合單機(jī)websocket的步驟 附github源碼
websocket 概念
websocket 是一個(gè)通信協(xié)議,通過(guò)單個(gè) TCP 連接提供全雙工通信。websocket 連接成功后,服務(wù)端和客戶可以進(jìn)行雙向通信。不同于 http 通信協(xié)議需要每次由客戶端發(fā)起,服務(wù)響應(yīng)到客戶端。
websocket 相對(duì)輪詢也能節(jié)約帶寬,并且能實(shí)時(shí)的進(jìn)行通信。
整合步驟
1. 添加 maven 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> <version>2.1.3.RELEASE</version> </dependency>
添加web、websocket和freemarker依賴。
2. 使用 ServerEndpointExporter 創(chuàng)建 bean
這個(gè) bean 會(huì)自動(dòng)注冊(cè)聲明 @ServerEndpoint 注解聲明的 websocket endpoint,使用springboot自帶tomcat啟動(dòng)需要該配置,使用獨(dú)立 tomcat 則不需要該配置。
@Configuration public class WebSocketConfig { //tomcat啟動(dòng)無(wú)需該配置 @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
3. 創(chuàng)建服務(wù)端端點(diǎn) (ServerEndpoint)
@Component @ServerEndpoint(value = "/message") @Slf4j public class WebSocket { private static Map<String, WebSocket> webSocketSet = new ConcurrentHashMap<>(); private Session session; @OnOpen public void onOpen(Session session) throws SocketException { this.session = session; webSocketSet.put(this.session.getId(),this); log.info("【websocket】有新的連接,總數(shù):{}",webSocketSet.size()); } @OnClose public void onClose(){ String id = this.session.getId(); if (id != null){ webSocketSet.remove(id); log.info("【websocket】連接斷開(kāi):總數(shù):{}",webSocketSet.size()); } } @OnMessage public void onMessage(String message){ if (!message.equals("ping")){ log.info("【wesocket】收到客戶端發(fā)送的消息,message={}",message); sendMessage(message); } } /** * 發(fā)送消息 * @param message * @return 全部都發(fā)送一遍 */ public void sendMessage(String message){ for (WebSocket webSocket : webSocketSet.values()) { webSocket.session.getAsyncRemote().sendText(message); } log.info("【wesocket】廣播消息,message={}", message); } }
4. 添加 controller 和 客戶端
添加 controller
@GetMapping({"","index.html"}) public ModelAndView index() { ModelAndView view = new ModelAndView("index"); return view; }
添加ftl頁(yè)面
<!DOCTYPE html> <html> <head> <title>websocket</title> </head> <body> <div> <input type="text" name="message" id="message"> <button id="sendBtn">發(fā)送</button> </div> <div style="width:100px;height: 500px;" id="content"> </div> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> <script type="text/javascript"> var ws = new WebSocket("ws://127.0.0.1:8080/message"); ws.onopen = function(evt) { console.log("Connection open ..."); }; ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); var p = $("<p>"+evt.data+"</p>") $("#content").prepend(p); $("#message").val(""); }; ws.onclose = function(evt) { console.log("Connection closed."); }; $("#sendBtn").click(function(){ var aa = $("#message").val(); ws.send(aa); }) </script> </body> </html>
5. 展示效果
附錄
到此這篇關(guān)于Spring Boot 整合單機(jī)websocket 附github源碼的文章就介紹到這了,更多相關(guān)Spring Boot 整合websocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jenkins節(jié)點(diǎn)配置實(shí)現(xiàn)原理及過(guò)程解析
這篇文章主要介紹了Jenkins節(jié)點(diǎn)配置實(shí)現(xiàn)原理及過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09java 異常被catch后 將會(huì)繼續(xù)執(zhí)行的操作
這篇文章主要介紹了java 異常被catch后 將會(huì)繼續(xù)執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Spring MVC 文件、cookies的接收 與REST響應(yīng)詳
在SpringMVC中,使用@RequestPart注解可接收文件并處理多部分請(qǐng)求,同時(shí)可以通過(guò)@CookieValue和HttpServletResponse來(lái)獲取和設(shè)置Cookies,本文介紹Spring MVC 文件、cookies的接收 與REST響應(yīng),感興趣的朋友跟隨小編一起看看吧2024-09-09總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系
Jupiter和Junit5之間有什么聯(lián)系?Jupiter提供了哪些新的測(cè)試方法?如何用IDEA和Jupiter生成可讀性更好的測(cè)試報(bào)告?文中有非常詳細(xì)的說(shuō)明,需要的朋友可以參考下2021-06-06Java實(shí)現(xiàn)多文件壓縮加密并重命名壓縮文件對(duì)象的方法
這篇文章主要介紹了Java實(shí)現(xiàn)多文件壓縮加密并重命名壓縮文件對(duì)象的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Spring BeanFactory和FactoryBean有哪些區(qū)別
這篇文章主要介紹了Spring BeanFactory 與 FactoryBean 的區(qū)別詳情,BeanFactory 和 FactoryBean 的區(qū)別卻是一個(gè)很重要的知識(shí)點(diǎn),在本文中將結(jié)合源碼進(jìn)行分析講解,需要的小伙伴可以參考一下2023-02-02

SpringBoot異常: nested exception is java.lang.NoClassDefFoundE

java基礎(chǔ)之標(biāo)簽、按鈕和按鈕事件簡(jiǎn)介