2014-01-09 77 views
9

想象一下,我有服務器和客戶端通過WebSocket通話。每次都發送另一批數據。不同的塊可能有不同的長度。websocket是基於流的還是基於包的協議?

我保證,如果服務器在一次通話中發送塊,那麼客戶端將收到一個message回調,反之亦然?也就是說,WebSocket是否具有嵌入式的「打包」功能,所以我不必在意在傳輸過程中我的數據是否在多個回調中分開,或者它不是?

+0

http://stackoverflow.com/q/21024173/632951,http://stackoverflow.com/a/13011241/632951 – Pacerier

回答

5

理論上WebSocket協議提供了一個基於消息的協議。但是,請記住...

  • WebSocket消息由一個或多個幀組成。
  • 一個框架可以是一個完整的框架或一個分段的框架。
  • 消息本身沒有任何長度指示內置到協議中,只有幀。
  • 幀的有效載荷長度可達9,223,372,036,854,775,807字節(由於該協議允許使用63位長度指示符)。
  • 分段的主要目的是允許在消息啓動時發送未知大小的消息,而不必緩衝該消息。

所以......

單個WebSocket的「消息」可能包含無限數量的9,223,372,036,854,775,807字節片段。

這可能使它難以實現通過其API來你總是提供完整的信息...

因此,雖然,在一般情況下,回答你的問題是,WebSocket協議是一個消息基於協議的協議,而且您不必手動構建消息。您用於使用協議的API可能具有適當的消息大小限制(以允許它保證將消息作爲單個塊傳送),或者可以呈現流接口以允許無限大小的消息。

在標準化過程here期間,我對此背道而馳。

+1

老咆哮(大約2011年),大多數的觀點都是沒有意義的,無效的,或現在解決在websocket的各種真實世界的實現中。 –

+0

好吧,我們會同意不同意我的想法,除非您喜歡對相關博客文章發表評論並指出它現在的不正確之處;那麼我們可以討論。事實上,實現CAN和DO提出自己的解決方法(例如消息大小限制)並不會減損協議規範允許上述行爲和恕我直言,這是不幸的,應該/本來可以處理的。 –

+0

我想所有參與討論的人都是網絡和WebSocket的專家;)但我想指出其他讀者的一點:我猜這是值得區分_API_和_protocol_的。 WebSocket API可以在不同級別上公開WebSocket:每個消息,每個幀或流。即使使用流媒體API,實現也可能暴露消息邊界。在任何情況下,WebSocket協議本身都是基於消息(和幀)的。它需要保留消息邊界 - 但不是幀邊界。 – oberstet

4

WebSocket是一種基於消息的協議,因此如果您發送大量數據作爲WebSocket消息的有效負載,那麼對等體將接收一個單獨的WebSocket消息,並將該數據塊恰好作爲有效負載數據塊。

相關問題