2013-07-03 67 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/)有关于如何完成的更多信息。