標籤:

怎樣自定義並使用websocket子協議?

從websocket API 中了解到,websocket 可以自定義子協議,想深入了解一下,但是好像網上並沒有類似的例子,請高手指點。


subprotocol 不過是 header 里的一個欄位而已。

RFC 6455 - The WebSocket Protocol

The WebSocket API


由於Websocket協議提供的是一個基於包的可靠傳輸協議,它並不像HTTP那樣是個應用協議,它的包對內容並不像HTTP那樣有Content-Type欄位去描述,是一個比較底層的協議,就和TCP一樣,如果要用來通信通常需要自己來定一個協議。那麼subprotocol就可以作為一個標示來讓服務端和客戶端之間進行協商用。

客戶端在進行連接的時候可以聲明自己能接受的子協議類型。這和HTTP請求頭裡帶的Accept和Accept-Encoding頭欄位一樣,說明自己你可以接受那些類型文件,或者編碼,通常是壓縮類型

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch

HTTP的請求裡帶的這樣,向server端說明它能理解哪些類型的數據。

然後和HTTP一樣,Server會根據合適的頭來返回相應的內容。 然後客戶單就知道怎麼樣去解釋響應的數據了。一下是subprotocol的例子:

請求:
Sec-WebSocket-Protocol:jsonrpc,protocol2
Sec-WebSocket-Version:13
Upgrade:websocket

響應:
Connection:Upgrade
Sec-WebSocket-Accept:lWc5qBYvZLWjFVzUOegIyRDnSG0=
Sec-Websocket-Protocol:jsonrpc
Upgrade:websocket

服務端告訴客戶端它選擇了jsonrpc這個格式,然後後面的數據,客戶端就知道怎麼樣去解釋響應的數據了。

和HTTP的這些協商頭一樣。 那麼具體怎麼設計這個自協議和自己實現一個交互協議是一樣的。Websocket支持兩類的數據包格式,一個是文本的,一個是Binary的。通常比較簡單的做法就可以直接返回json,然後客戶端去做相應的解釋。也可以使用二進位。比如可以自己去定義數據格式。或者很多使用像protobuf和thrift這樣的二進位格式。

具體怎麼設計也要看你的使用場景。因為Websocket不一定使用在瀏覽器這個場景。這個時候格式的選擇可以靈活些。但是如果你的協議要支持在瀏覽器中使用。那麼你也要考慮在瀏覽器下你的格式是否能方便的解析。協議設計其實比較複雜要看場景,比如像TCP這樣的協議在底層就考慮了很多的關於可靠性方面的優化。不過websocket本身就是個可靠的協議,它也是全雙工的,如果要在這之上實現RPC的功能,那麼你要考慮的問題就更多了。真想要自己設計的話,可以去參考各種標準協議的設計。


推薦閱讀:

北京榮新IT培訓怎麼樣?
B站是否真的實現支持html5[高清]播放器?
購買域名後該怎麼建網站?
HTML 5已經出爐了!可否跳過4 直接學5呢!?
HTML5 開發人員的待遇普遍是什麼水平?

TAG:HTML5 | WebSocket |