可以与 WebSockets 一起使用的二进制数据编码的替代方法是什么?我只知道你可以使用Base64。还有其他人吗?
2 回答
几乎不再需要将二进制数据编码为文本,因为基本上所有支持 WebSocket 的浏览器现在都支持通过类型化数组(arraybuffers)和 Blob 发送/接收原始二进制数据。只有少数情况下需要这样做:
- 在没有内置 WebSocket 支持的浏览器上使用web-socket-js后备,例如 Internet Explorer 6-9 和 firefox 3.6。请注意,web-socket-js 不支持二进制数据的原因是因为这些浏览器不支持类型化数组和 Blob,因此“二进制”数据已经在浏览器中以某种方式编码(通常是 0-255 的普通数字数组) 或作为具有非 ASCII 字符值的字符串。
- 在仅支持 WebSocket Hixie 协议(无法发送原始二进制数据)的浏览器上,例如 Safari(移动和桌面)版本低于 6。
在这些情况下,base64 并不是您唯一的编码选项。任何产生有效 UTF-8 文本(所有版本的 WebSockets 支持的文本格式)的编码都将起作用。Base64 恰好很容易通过 atob 和 btoa 函数在浏览器中得到支持。例如,如果您有一个表示二进制字节值的数字数组,那么您可以将其编码为可以通过任何 WebSocket 版本安全发送的 JSON 字符串:
JSON.stringify([120,32,255])
'[120,32,255]'
它简单易读,但与 base64 相比,它的空间效率要低得多。还有更有效的方法将二进制数据编码为 UTF-8 字符串,这将更节省空间,但是,它们最终会在浏览器中消耗更多的 CPU 资源,并且需要自定义算法将二进制数据映射到 UTF- 8 个代码点。
WebSockets 支持原始二进制数据。这如何暴露取决于您使用的语言/库/API。在 JavaScript/浏览器中,您可以使用类型化数组(ArrayBuffer 或 Blob)调用 send。当接收到二进制消息时,它将作为这些类型之一传递。WebSocket 浏览器 API 文档 ( http://www.w3.org/TR/websockets/ ) 提供了有关如何完成此操作的更多信息。