我试图在二进制模式下使用websockets将二进制数据从用Python编写的服务器传输到客户端浏览器(运行javascript)。我已经在文本模式下实现了这种通信,但现在我希望通过以二进制模式进行通信来提高性能。
我见过的所有例子(例如this,以及如果挖掘使用Tornado的matplotlib / webagg的源代码)声称他们使用二进制模式,但事实上他们似乎编码原始在传输之前的某个时刻将二进制数据转换为UTF-8(或base64)。在我看来,这不是真正的二进制传输,因为它增加了30%到50%的开销。
所以我的问题是,为了使用基于IP的websockets,是否必须将二进制数据编码为utf-8或base64?如果没有,请指出一个没有编码的例子。
我一直认为套接字确实支持真正的二进制通信,但由于某种原因,可能不是IP websockets的情况。也许有人可以阐明这个问题。在这一领域,过去一年左右似乎取得了一些进展,从而增加了混乱。
答案 0 :(得分:9)
IETF 6455 WebSocket Protocol支持直接发送/接收二进制数据(较旧的Hixie协议变体没有)。如果您正在实现自己的框架,那么您只需要将框架中的操作码设置为0x2,以指示有效负载是原始二进制数据而不是UTF-8编码文本。如果您使用的是python WebSocket库,那么您需要使用该库提供的API来选择二进制模式(如果库支持它)。
注意:您链接的example不是WebSocket示例(它只是常规的TCP客户端和服务器)。此外,该示例不将数据编码为UTF-8或base64。 Websockify是一个支持直接二进制数据的WebSocket服务器(除了旧的Hixie变体的base64编码)。 免责声明:我创建了websockify。