我在python中写了一个(不那么)简单的websocket服务器,它在一个端口中监听,执行握手,然后向客户端发送一系列包含数字的消息(间隔一个随机间隔)。
我写了一个javascript客户端,并在Chrome和Safari下进行了测试。我发现Chrome和Safari使用不同的WebSocket版本。例如,Chrome使用Sec-WebSocket-Key(并期望Sec-WebSocket-Accept),而Safari则在标头之后发送Sec-WebSocket-Key1,Sec-WebSocket-Key2和一堆8字节。
我在服务器中实现了一个握手功能,它可以检测所需的握手类型并执行它。这个问题解决了。 websocket可以从Chrome或Safari(OSX,Windows和IOS5版本)正确打开。
但我有另一个问题。显然,Safari发送并期望由0x00和0xFF分隔的消息,而Chrome发送并期望有框架和屏蔽数据(使用更新版本的websocket规范)。
我想拥有一台服务器,可以满足客户的期望。我的问题是,如何预先判断数据是否必须以帧为单位或0x00,0xFF分隔?
我想我可以假设,如果握手协议基于Key1和Key2,客户端是Safari,然后使用0x00 0xFF来分隔数据,而如果它使用Sec-WebSocket-Key,则客户端是Chrome,并且然后使用框架数据。但是我对这个解决方案并不满意,因为它不是一般的。想法?
答案 0 :(得分:3)
已发布Safari(桌面和移动设备)使用的hixie-76协议变体和Chrome及其他人使用的RFC 6455标准。
您可以使用请求的握手类型来决定客户端说话的协议版本,消息读取时将使用哪种框架以及在消息写入时应使用哪种框架。
答案 1 :(得分:1)
为了回答你原来的问题,因为我有同样的需求,我发现window.WebSocket.CLOSED在最新的实现中等于3,在较旧的时候,它等于2(Android示例浏览器)。 / p>
因此,我现在用于检测对最新WebSocket协议的支持的测试是:
if('WebSocket' in window
&&'function' === typeof window.WebSocket
&&3 === window.WebSocket.CLOSED) {
// hurra !
}
我在Chrome,Firefox(成功的地方)和Android浏览器(失败的地方)上进行了测试。希望它会帮助那里的一些人。
答案 2 :(得分:-1)
简单:只是WebSockets的一个版本。其余的都是草稿。既然RFC已经出来了,那么官方建议你不要实现其他任何东西。最新版本的Firefox和Chrome都实现了RFC版本,并且它们会自动更新。草稿将很快停止被客户使用,因此即使为了获得更多的互操作性,也没有必要尝试实现它们。
他们已经不再相关了,并且增加了一些东西。任何浏览器供应商都不打算继续支持草稿。实际上,Mozilla在确定他们的websocket对象之前一直等到规范。同样,浏览器供应商明确表示,为草稿编写的任何应用程序都应该是演示,而不是生产代码,并且不会期望他们支持草稿服务器,而不是支持草稿客户端代码。
所以,坚持一个规范,忘记草案的早期实现。