【问题标题】:Binary data over websocket without encoding to UTF-8 or base64websocket 上的二进制数据,未编码为 UTF-8 或 base64
【发布时间】:2013-01-26 15:11:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可能会发现 this 具有相关性。

标签: javascript python binary websocket


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 2011-11-02
    • 2014-11-06
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2015-06-27
    相关资源
    最近更新 更多