2015-07-03 187 views
1

我很困惑。我想了解Websockets是如何工作的,並且已經在node.js和客戶端中構建了一個服務器。 我無法理解的是,Websocket如何發送數據。 在從客戶端(瀏覽器)發送數據之前,數據base64是否已編碼? 'binarytype'是如何工作的?僅用於接收?Websocket base64,二進制類型

我也必須在服務器上實現這些嗎? 服務器端需要'binarytype'選項嗎?

我什麼時候需要blob和arraybuffer?取決於小型和大型數據? 什麼是如果獲得視頻和音頻文件?

我就如何圖片應該在網絡發送一看,我發現 很經常的解決方案,該圖像是base64編碼,之後發送。 但是,如果在瀏覽器中的WebSocket API已編碼的二進制文件爲Base64,我也不會做這個..

對不起,我很迷茫,希望有人能幫助我

回答

3

閱讀RFC 6455,尤其是5. Data Framing,您可以在那裏找到答案。

在WebSocket協議中,使用幀的序列(而不是base64編碼)傳輸數據。在RFC 6455中定義的幀類型如下。

  1. 續幀(操作碼=爲0x0)
  2. 文本幀(操作碼=爲0x1)
  3. 二進制幀(操作碼= 0×2)
  4. 關閉幀(操作碼= 0x8中)
  5. Ping幀(操作碼= 0x9)
  6. 乒乓幀(操作碼= 0xA)

體面的WebSocket庫(客戶端和服務器端)可以處理所有這些幀,並提供發送/接收它們的函數/方法。因此,無論數據是文本還是二進制數據(除非您選擇錯誤的WebSocket庫),您都不必擔心數據的編碼方式。

請注意,客戶端和服務器都可以發送/接收文本幀和二進制幀。

+0

謝謝你的回答。但是我正在編寫我自己的libray,並想了解它是如何工作的。我知道幀被髮送,但是如何將數據放入該幀?編碼中會發生什麼? – benu

+0

查看[WebSocketOutputStream.write(WebSocketFrame)]的實現(https://github.com/TakahikoKawasaki/nv-websocket-client/blob/master/src/main/java/com/neovisionaries/ws/client/WebSocketOutputStream。 java#L41)在[nv-websocket-client](https://github.com/TakahikoKawasaki/nv-websocket-client)中,你可以理解數據是如何打包成幀的。請注意,當幀從客戶端發送到服務器時,有效載荷部分必須被屏蔽,並且不得處於相反的方向。請參閱RFC 6455 [5.3。客戶端到服務器屏蔽](https://tools.ietf.org/html/rfc6455#section-5.3)瞭解詳細信息。 –

+0

我現在明白數據是如何發送的。但這不是我想要的。你能解釋一下'binarytype'選項是什麼嗎?當客戶端瀏覽器API設置爲「blob」並且傳入消息包含一個arraybuffer時,它是否會更改傳入消息的實體?還是隻是一個願望,它是如何(傳入的消息)首選?服務器如何知道在瀏覽器中客戶端設置的'binarytype'選項是什麼? – benu

1

的WebSockets可以傳輸文本和二進制數據。 WebSocket二進制數據有兩種形狀:blob和數組緩衝區。

ws.binaryType = "blob"; 
// or 
ws.binaryType = "arraybuffer"; 

所以你不需要改變二元文本和文本到二進制做傳輸。你可以直接使用二進制。

你可能提到的問題(例如二進制到base64)是由於很長一段時間瀏覽器不能很好地處理與JavaScript結合的二進制文件,所以你需要將文本四處洗牌,繞過限制。在現代瀏覽器中這已經得到了改進(儘管我不知道每個主要瀏覽器的確切支持)。

看一看本作更多的細節:Processing Binary Protocols with Client-Side JavaScript

對於服務器端,是的,你還需要處理二進制數據。如果客戶端期望二進制服務器應發送二進制文件。現在,我並不是那麼熟悉Node.js,但是快速搜索發現這個看起來很有前景的包:http://binaryjs.com/

+0

謝謝你的回答。我是否必須爲服務器實現「二進制類型」選項?據我所知,'binarytype'選項僅作爲反饋的客戶端來處理傳入的消息。我怎樣才能檢查服務器端,哪個「binarytype」是從客戶端需要? – benu