如何知道客户端使用哪个websocket版本?

时间:2012-03-13 08:52:05

标签: google-chrome safari version websocket

我在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,并且然后使用框架数据。但是我对这个解决方案并不满意,因为它不是一般的。想法?

3 个答案:

答案 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对象之前一直等到规范。同样,浏览器供应商明确表示,为草稿编写的任何应用程序都应该是演示,而不是生产代码,并且不会期望他们支持草稿服务器,而不是支持草稿客户端代码。

所以,坚持一个规范,忘记草案的早期实现。