不编码为UTF-8或base64的二进制数据通过WebSocket传输

8
我正在尝试使用二进制模式的Websockets将二进制数据从Python编写的服务器传输到客户端浏览器(运行JavaScript)。我已经在文本模式下实现了这种通信,但现在我希望通过使用二进制模式来提高性能。
我看到的所有示例(例如这个和使用Tornado的matplotlib/webagg的源代码)都声称它们正在使用二进制模式,但实际上它们似乎在传输之前将原始二进制数据编码为UTF-8(或Base64)。在我看来,这样做并不是真正的二进制传输,因为它会增加30%到50%的开销。
因此,我的问题是,是否必须将二进制数据编码为UTF-8或Base64才能使用基于IP的Websockets?如果不是,请指向一个在不编码的情况下完成此操作的示例。
我一直相信套接字支持真正的二进制通信,但也许对于某些原因,IP Websockets不支持。也许有人可以解释一下这个问题。在这个领域似乎有了一些进展,所以这增加了混淆。

你可能会发现这个链接与你相关。 - Tomasz Łazarowicz
1个回答

11

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接