7

我正在尝试以二进制模式使用 websockets 将二进制数据从用 Python 编写的服务器传输到客户端浏览器(运行 javascript)。我已经以文本模式实现了这种通信,但现在我希望通过以二进制模式进行通信来提高性能。

我见过的所有示例(例如,如果有人通过使用 Tornado 的 matplotlib/webagg 的源代码进行挖掘)声称它们正在使用二进制模式,但实际上它们似乎将原始二进制数据编码为 UTF-8(或base64)在传输前的某个时间点。在我看来,这样做并不是真正的二进制传输,因为它会增加 30% 到 50% 的开销。

所以我的问题是,是否必须将二进制数据编码为 utf-8 或 base64 才能使用基于 IP 的 websocket?如果没有,请指出一个示例,该示例无需编码即可完成。

我一直认为套接字确实支持真正的二进制通信,但由于某种原因,IP websockets 可能并非如此。也许有人可以阐明这件事。在过去一年左右的时间里,该领域似乎取得了进展,这增加了混乱。

4

1 回答 1

10

IETF 6455 WebSocket 协议支持直接发送/接收二进制数据(旧的Hixie 协议变体不支持)。如果您正在实现自己的框架,那么您只需将框架中的操作码设置为 0x2 以指示有效负载是原始二进制数据而不是 UTF-8 编码文本。如果您使用的是 python WebSocket 库,那么您需要使用该库提供的 API 来选择二进制模式(如果库支持的话)。

注意:您链接到的示例不是 WebSocket 示例(它只是一个常规的 TCP 客户端和服务器)。此外,该示例将数据编码为 UTF-8 或 base64。Websockify是一个 WebSocket 服务器,它支持直接二进制数据(除了旧的 Hixie 变体的 base64 编码)。免责声明:我创建了 websockify。

于 2013-02-11T15:54:20.627 回答