2013-07-03 62 views

回答

4

由於基本上所有帶WebSocket支持的瀏覽器現在都支持通過Typed Arrays(數組緩衝區)和Blob發送/接收原始二進制數據,因此很少需要將文本編碼爲文本。只有少數場合,這是必要的:

  • 使用web-socket-js回退與不具備內置如Internet Explorer 6-9和Firefox 3.6的WebSocket支持的瀏覽器。請注意,web-socket-js不支持二進制數據的原因是因爲這些瀏覽器不支持Typed Arrays和Blob,所以「二進制」數據已經在瀏覽器中以某種方式進行編碼(通常是從0到255之間的普通數字數組)或作爲具有非ASCII字符值的字符串。
  • 在僅支持的WebSocket Hixie協議(其不具有要發送的原始二進制數據的能力)的瀏覽器,如Safari(移動設備和桌面)版本小於6

在這些情況下,Base64是不是您唯一的編碼選項。任何導致有效UTF-8文本的編碼(所有版本的WebSocket均支持文本格式)將會起作用。通過atob和btoa函數,Base64恰好很容易在瀏覽器中支持。例如,如果你有一個表示二進制字節值的數字陣列,那麼你可以只編碼這一個JSON字符串,它是安全的通過任何WebSocket的版本送:

JSON.stringify([120,32,255]) 
'[120,32,255]' 

它是簡單和人類可讀的,但與base64相比,它的空間效率要低得多。將二進制數據編碼爲UTF-8字符串的方法也更加高效,但是,它們最終會消耗瀏覽器中更多的CPU資源,並需要一種自定義算法將二進制數據映射到UTF- 8碼點。

+0

謝謝你的詳細答案。 – pvorb

2

WebSockets支持原始二進制數據。這是如何公開取決於你使用的語言/庫/ API。在JavaScript /瀏覽器中,您可以使用Typed數組(ArrayBuffer或Blob)調用send。當接收到二進制消息時,它將作爲這些類型之一進行傳送。 WebSocket瀏覽器API文檔(http://www.w3.org/TR/websockets/)有關於如何完成的更多信息。