Spring Boot中的WebSocket 當(dāng)前滾動
須彌零一SpringBoot中的WebSocket很多網(wǎng)站為了實現(xiàn)推送技術(shù),所用的技術(shù)都是輪詢。輪詢是在特定的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTT
很多網(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)WebSocket服務(wù)4.0.0 cn.jeremysong demo 1.0 org.springframework.boot spring-boot-starter-parent 3.0.3 org.springframework.boot spring-boot-starter-websocket 3.0.3
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;privatestaticConcurrentHashMap使用JavaScript創(chuàng)建WebSocket ClientWebSocket客戶端webSocketSet=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();}}}
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歡迎關(guān)注我的公眾號“須彌零一”,原創(chuàng)技術(shù)文章第一時間推送。
關(guān)鍵詞:
[ 相關(guān)文章 ]
須彌零一SpringBoot中的WebSocket很多網(wǎng)站為了實現(xiàn)推送技術(shù),所用的技術(shù)都是輪詢。輪詢是在特定的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTT
第一步。首先,第一步。我們打開軟件,找到界面中的選項后,點擊打開選項設(shè)置界面。2 打開選項界面后,我們在界面左側(cè)的選項中
稅務(wù)稽查是指由稅務(wù)稽查部門依法組織實施的,是稅務(wù)機關(guān)代表國家依法對納稅人的納稅情況進行檢查監(jiān)督的一種形式,對納稅人以及扣
中建海峽“建證未來”公益支教團走進廈門市翔安區(qū)萃英小學(xué)
上交所2023年3月9日交易公開信息顯示,納睿雷達因?qū)儆谟袃r格漲跌幅限制的日換手率達到30%的前五只證券而登上龍虎榜。
1、裊[裊]拼音:niǎo繁體:嫋部首:衣部首筆劃:6字意五行:土簡體筆劃:10拼音輸入:niao五
隨著天氣轉(zhuǎn)暖,我國早稻育秧、春小麥播種加快推進;全國早稻育秧近兩成,春耕生產(chǎn)開局良好。農(nóng)業(yè)農(nóng)村部最新農(nóng)情調(diào)度顯示,目前全
1、第二部的結(jié)局是:銀塵死了,卻救出l了吉爾伽美什,麒麟成了0度王爵,可以忍受住白銀祭司的黑暗靈魂和黃金瞳孔的毒性。2、《臨界爵跡》還沒
長沙晚報掌上長沙3月9日訊據(jù)國家統(tǒng)計局消息3月9日,國家統(tǒng)計局發(fā)布了2023年2月份全國CPI(居民消費價格指數(shù))和
1、歌曲:《兄弟》作曲:陳羽凡編曲:宮永治郎、JiroMiyana作詞:羽泉演唱:羽泉歌詞:桃園里,三位志士相遇彼此志
如今的一線手機廠商,不帶上幾款折疊屏產(chǎn)品,就無法在市場上展現(xiàn)自己的R&D實力。然而,對于這樣的產(chǎn)品,小米自推出MIX
查營業(yè)執(zhí)照的方式如下:1、百度搜索全國企業(yè)信用公示系統(tǒng),搜索頁面上就能出現(xiàn)官網(wǎng),點擊進入即可;2、進入到國家企業(yè)信用信息公示系統(tǒng)后,輸
1、,不可以,現(xiàn)是電子客票,預(yù)訂好后提前兩個小時到機場。2、到機場拿身份證在航司柜臺或自動值機臺換登機牌過安檢即可!若報
1、集群,發(fā)音c4。是個形聲字,從竹子到族音。原意是竹子叢生。也可以用來表示蠶山。003010等。有相關(guān)記錄。2、“叢”
新華網(wǎng)記者馬若虎閆雨昕“我們目光之所及是星辰大海,但我們走過的每一步路都是腳踏實地。”7日下午舉行的第二場“代表通道”采訪活動中,全國
1、海水密度一般在1 02~1 07之間,它取決于溫度、鹽度和壓力(或深度)。2、在低溫、高鹽和深水壓力大的情況下,海水
今年全國兩會,“數(shù)字經(jīng)濟”在政府工作報告中再被提及,這已是“數(shù)字經(jīng)濟”第6年出現(xiàn)在政府工作報告中,報告指出,“大力發(fā)展數(shù)字經(jīng)濟,提升常
微晶玻璃(CRYSTOEandNEOPARIES)又稱微晶玉石或陶瓷玻璃。是綜合玻璃,是一種外國剛剛開發(fā)的新型的建筑材料,它的學(xué)名叫做玻璃水晶。微晶玻璃和我
“到點了就來食堂吃,不僅菜品豐富、老年人吃飯有折扣,還能和老伙伴們嘮家常!”自打社區(qū)的“幸福餐桌”開張,中午11點,家住錢塘社區(qū)金基曉廬
1、涼拌苦菊??嗑?具有抗菌、解熱、消炎、明目等作用??嗑瘴堵钥?顏色碧綠,可炒食或涼拌,是清熱去火的美食佳品。原料:苦菊兩顆,熟芝麻50克,
[ 相關(guān)新聞 ]
Copyright 2015-2022 太平洋醫(yī)院網(wǎng) 版權(quán)所有 備案號:豫ICP備2022016495號-17 聯(lián)系郵箱:93 96 74 66 9@qq.com