我正在尝试使用websockify来允许在浏览器中执行的javascript与我的手写服务器通信。使用最新版本的Chrome和Firefox时,我从websockify收到以下错误消息:
客户端必须支持“二进制”或“ base64”协议
查看代码后,我确定只要这两个协议都未能出现在从客户端接收到的Sec-Websocket-Protocol标头下,websockify就会传递此消息并关闭套接字。当我查看Chrome传输的原始数据时,它甚至没有发送此标头。这是Chrome或websockify的问题,还是在JavaScript中打开websocket时我无法提供某些信息?还是有其他解释?
最佳答案
您需要提供协议列表作为对象构造函数的一部分:
var ws = new WebSocket(uri, ['binary', 'base64']);
如果您使用websockify随附的websock.js库,则它将为您处理。但是,请注意,websock.js不提供标准的WebSocket API,而是提供面向流的API。即使您使用原始的WebSocket连接来进行websockify,也请注意,由于普通的TCP没有消息的概念,因此仍然需要进行消息重构,因此从onmessage进行消息分块实际上是“任意的”。