WebSocket通信


什么是WebSocket

WebSocket ——一種在2011 年被互聯網工程任務組(IETF)標准化的協議。

WebSocket解決了一個長期存在的問題:既然底層的協議(HTTP)是一個請求/響應模式的交互序列,那么如何實時地發布信息呢?AJAX提供了一定程度上的改善,但是數據流仍然是由客戶端所發送的請求驅動的。還有其他的一些或多或少的取巧方式(Comet)

WebSocket規范以及它的實現代表了對一種更加有效的解決方案的嘗試。簡單地說,WebSocket提供了“在一個單個的TCP連接上提供雙向的通信……結合WebSocket API……它為網頁和遠程服務器之間的雙向通信提供了一種替代HTTP輪詢的方案。

,但是最終它們仍然屬於擴展性受限的變通之法。也就是說,WebSocket 在客戶端和服務器之間提供了真正的雙向數據交換。WebSocket 連接允許客戶端和服務器之間進行全雙工通信,以便任一方都可以通過建立的連接將數據推送到另一端。WebSocket 只需要建立一次連接,就可以一直保持連接狀態。這相比於輪詢方式的不停建立連接顯然效率要大大提高。

Web瀏覽器和服務器都必須實現 WebSockets 協議來建立和維護連接。

特點

l HTML5中的協議,實現與客戶端與服務器雙向,基於消息的文本或二進制數據通信

l 適合於對數據的實時性要求比較強的場景,如通信、直播、共享桌面,特別適合於客戶與服務頻繁交互的情況下,如實時共享、多人協作等平台。

l 采用新的協議,后端需要單獨實現

l 客戶端並不是所有瀏覽器都支持

WebSocket通信握手

Websocket借用了HTTP的協議來完成一部分握手

客戶端的請求:

Connection 必須設置 Upgrade,表示客戶端希望連接升級。

Upgrade 字段必須設置 Websocket,表示希望升級到 Websocket 協議。

Sec-WebSocket-Key 是隨機的字符串,服務器端會用這些數據來構造出一個 SHA-1 的信息摘要。把 “Sec-WebSocket-Key” 加上一個特殊字符串 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后計算 SHA-1 摘要,之后進行 BASE-64 編碼,將結果做為 “Sec-WebSocket-Accept” 頭的值,返回給客戶端。如此操作,可以盡量避免普通 HTTP 請求被誤認為 Websocket 協議。

Sec-WebSocket-Version 表示支持的 Websocket 版本。RFC6455 要求使用的版本是 13,之前草案的版本均應當棄用。

服務器端:

Upgrade: websocket

Connection: Upgrade

依然是固定的,告訴客戶端即將升級的是 Websocket 協議,而不是mozillasocketlurnarsocket或者shitsocket

然后, Sec-WebSocket-Accept 這個則是經過服務器確認,並且加密過后的 Sec-WebSocket-Key  

后面的, Sec-WebSocket-Protocol 則是表示最終使用的協議。

至此,HTTP已經完成它所有工作了,接下來就是完全按照Websocket協議進行

WebSocket通信-STOMP

WebSocket是個規范在實際的實現中有HTML5規范中的WebSocket APIWebSocket的子協議STOMP

STOMP(Simple Text Oriented Messaging Protocol)

簡單()文本定向消息協議

l STOMP協議的前身是TTMP協議(一個簡單的基於文本的協議),專為消息中間件設計。是屬於消息隊列的一種協議, AMQP, JMS平級. 它的簡單性恰巧可以用於定義websocket的消息體格式. STOMP協議很多MQ都已支持, 比如RabbitMq, ActiveMq

l 生產者(發送消息)、消息代理、消費者(訂閱然后收到消息)

STOMP是基於幀的協議

 

WebSocket通信實現

SpringBoot

基於Stomp的聊天室/IM的實現

 

 

 

 

 

WebSocket的集成

 

 

 

Netty

 

由IETF 發布的WebSocket RFC,定義了6 種幀,Netty 為它們每種都提供了一個POJO 實現。同時Netty也為我們提供很多的handler專門用來處理數據壓縮,ws的通信握手等等。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM