通过WebSocket发送二进制数据而不编码为UTF-8或base64
我正在尝试使用WebSocket的二进制模式,将从用Python写的服务器传输二进制数据到客户端浏览器(运行JavaScript)。我之前已经实现了文本模式的通信,但现在我想通过使用二进制模式来提高性能。
我看到的所有示例(例如这个,还有如果深入研究使用Tornado的matplotlib/webagg的源代码)都声称他们在使用二进制模式,但实际上他们似乎在传输之前的某个环节把原始的二进制数据编码成了UTF-8(或者base64)。在我看来,这样做并不是真正的二进制传输,因为这会增加30%到50%的开销。
所以我的问题是,使用基于IP的WebSocket时,是否一定要把二进制数据编码成UTF-8或base64?如果不需要,请给我一个不编码的示例。
我一直相信套接字确实支持真正的二进制通信,但也许由于某种原因,IP WebSocket并不是这样。也许有人能对此提供一些见解。在过去一年左右的时间里,这个领域似乎有了一些进展,这让人更加困惑。
1 个回答
IETF 6455 WebSocket协议支持直接发送和接收二进制数据(而旧版的Hixie协议不支持)。如果你自己在实现数据的封装方式,只需要把封装中的操作码设置为0x2,这样就能告诉系统你发送的是原始的二进制数据,而不是UTF-8编码的文本。如果你在使用Python的WebSocket库,那么你需要利用这个库提供的接口来选择二进制模式(前提是这个库支持这种模式)。
注意:你链接的示例并不是WebSocket的示例(它只是一个普通的TCP客户端和服务器)。而且,这个示例并没有将数据编码为UTF-8或base64。Websockify是一个支持直接二进制数据的WebSocket服务器(同时也支持旧版Hixie的base64编码)。免责声明:我是websockify的创建者。