国产AⅤ无码一区二区三区_青青在线香蕉精品视频在线_2021年国产精品专区丝袜_久久青草费线频观看地址_亚洲A综合一区二区三区

首頁 >  資訊 >  詳情

Spring Boot中的WebSocket 當(dāng)前滾動

2023-03-09 23:37:22來源:程序員客棧
須彌零一
Spring Boot中的WebSocket

很多網(wǎng)站為了實現(xiàn)推送技術(shù),所用的技術(shù)都是輪詢。輪詢是在特定的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTTP請求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。這種傳統(tǒng)的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務(wù)器發(fā)出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數(shù)據(jù)可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。

在這種情況下,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實時地進行通訊。


(資料圖)

簡介

WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。

WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。

特點

?較少的控制開銷。相對于HTTP請求每次都要攜帶完整的頭部,開銷顯著減少了。

?更強的實時性。由于協(xié)議是全雙工的,所以服務(wù)器可以隨時主動給客戶端下發(fā)數(shù)據(jù)。

?保持連接狀態(tài)。Websocket需要先創(chuàng)建連接,是一種有狀態(tài)的協(xié)議,之后通信時可以省略部分狀態(tài)信息。而HTTP請求可能需要在每個請求都攜帶狀態(tài)信息(如身份認證等)。

?更好的二進制支持。Websocket定義了二進制幀,相對HTTP,可以更輕松地處理二進制內(nèi)容。

?可以支持擴展。Websocket定義了擴展,用戶可以擴展協(xié)議、實現(xiàn)部分自定義的子協(xié)議。如部分瀏覽器支持壓縮等。

?更好的壓縮效果。相對于HTTP壓縮,Websocket在適當(dāng)?shù)臄U展支持下,可以沿用之前內(nèi)容的上下文,在傳遞類似的數(shù)據(jù)時,可以顯著地提高壓縮率。

在SpringBoot項目中創(chuàng)建WebSocket Server項目依賴(Maven)

4.0.0cn.jeremysongdemo1.0org.springframework.bootspring-boot-starter-parent3.0.3org.springframework.bootspring-boot-starter-websocket3.0.3

WebSocket服務(wù)

importorg.springframework.context.annotation.Bean;importorg.springframework.stereotype.Component;importorg.springframework.web.socket.server.standard.ServerEndpointExporter;/***ServerEndpointExporter作用**這個Bean會自動注冊使用@ServerEndpoint注解聲明的websocketendpoint**/@ComponentpublicclassWebSocketConfig{@BeanpublicServerEndPointExporterserverEndPointExporter(){returnnewServerEndPointExporter();}}

importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importjavax.websocket.OnClose;importjavax.websocket.OnMessage;importjavax.websocket.OnOpen;importjavax.websocket.Session;importjavax.websocket.server.PathParam;importjavax.websocket.server.ServerEndpoint;importjava.io.IOException;importjava.util.concurrent.ConcurrentHashMap;@Slf4j@Component@ServerEndpoint("/websocket/{name}")publicclassWebSocket{privateSessionsession;privateStringname;privatestaticConcurrentHashMapwebSocketSet=newConcurrentHashMap<>();@OnOpenpublicvoidonOpen(Sessionsession,@PathParam(value="name")Stringname){this.session=session;this.name=name;webSocketSet.put(name,this);}@OnClosepublicvoidonClose(){webSocketSet.remove(this.name);}@OnMessagepublicvoidonMessage(Stringmessage){log.info("{}send{}",this.name,message);}/***群發(fā)*@parammessage消息內(nèi)容*/publicvoidgroupSending(Stringmessage){for(Stringname:webSocketSet.keySet()){try{webSocketSet.get(name).session.getBasicRemote().sendText(message);}catch(IOExceptione){e.printStackTrace();}}}/***指定發(fā)動消息*@paramname指定的客戶端名*@parammessage消息內(nèi)容*/publicvoidappointSending(Stringname,Stringmessage){try{webSocketSet.get(name).session.getBasicRemote().sendText(message);}catch(IOExceptione){e.printStackTrace();}}}

使用JavaScript創(chuàng)建WebSocket ClientWebSocket客戶端

letwebsocket=null;if("WebSocket"inwindow){websocket=newWebSocket("ws://localhost:8888/websocket/cli-1");websocket.onopen=function(){console.log("連接成功");};websocket.onclose=function(){console.log("退出連接");};websocket.onmessage=function(event){console.log("收到消息:"+event.data);};websocket.onerror=function(){console.log("連接出錯");};//MDNExamplewebsocket.addEventListener("open",function(event){websocket.send("HelloServer!");});websocket.addEventListener("message",function(event){console.log("Messagefromserver",event.data);});websocket.addEventListener("error",function(event){console.log("WebScoketerror:",event);});}window.onbeforeunload=function(){//頁面關(guān)閉時關(guān)閉WebSocket連接websocket.close(1000);};

在Chrome console中測試

執(zhí)行如下命令時可以在Server端添加日志輸出和debug觀察交互現(xiàn)象。

>ws1=newWebSocket("ws://localhost:8888/websocket/name1");>ws1.send("Sendmessagetoserver!Iamname1");>ws2=newWebSocket("ws://localhost:8888/websocket/name2");>ws2.send("Sendmessagetoserver!Iamname2");>ws1.close(1000);>ws2.close(1000);

參考

?WebSocket - MDN:

https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

?CloseEvent - MDN:

https://developer.mozilla.org/zh-CN/docs/Web/API/CloseEvent#status_codes
---- END ----

歡迎關(guān)注我的公眾號“須彌零一”,原創(chuàng)技術(shù)文章第一時間推送。

關(guān)鍵詞:

[ 相關(guān)文章 ]