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

Google chrome 如何知道客户端使用哪个websocket版本?,google-chrome,safari,version,websocket,Google Chrome,Safari,Version,Websocket,我用python编写了一个(并非如此)简单的websocket服务器,它在端口中侦听,执行握手,然后向客户端发送一系列包含数字的消息(间隔为随机间隔) 我编写了一个javascript客户端,并在Chrome和Safari下进行了测试。我发现Chrome和Safari使用不同的WebSocket版本。例如,Chrome使用Sec-WebSocket键(并期望Sec-WebSocket接受),而Safari则在头后发送Sec-WebSocket-Key1、Sec-WebSocket-Key2和一组

我用python编写了一个(并非如此)简单的websocket服务器,它在端口中侦听,执行握手,然后向客户端发送一系列包含数字的消息(间隔为随机间隔)

我编写了一个javascript客户端,并在Chrome和Safari下进行了测试。我发现Chrome和Safari使用不同的WebSocket版本。例如,Chrome使用Sec-WebSocket键(并期望Sec-WebSocket接受),而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密钥,则客户端为Chrome,然后使用框架数据。然而,我不满意这个解决方案,因为它不是通用的。想法?

对于Safari(桌面和移动设备)和Chrome及其他公司使用的协议变体,都有已发布的标准


您可以使用请求的握手类型来决定客户端使用的协议版本、消息读取时存在的帧以及消息写入时应使用的帧。

简单:这只是WebSocket的一个版本。其余的都是草稿。既然RFC已经发布,官方建议您不要执行任何其他操作。Firefox和Chrome的最新版本都实现了RFC版本,并且它们会自动更新。这些草案将很快停止被客户机使用,因此,即使为了获得更多的互操作性,也没有必要尝试实现它们

它们不再相关,并且添加了cruft。任何浏览器供应商都不打算继续支持这些草案。事实上,Mozilla在修复websocket对象之前一直等到规范发布。类似地,浏览器供应商很清楚,为草稿编写的任何应用程序都应该是演示,而不是生产代码,而且他们不会像支持草稿客户端代码那样支持草稿服务器


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

为了回答您最初的问题,因为我也有同样的需要,我发现window.WebSocket.CLOSED在最新的实现中等于3,而在旧的实现中,它等于2(例如Android本机浏览器)

因此,我现在进行的测试是检测对最新WebSocket协议的支持:

if('WebSocket' in window
    &&'function' === typeof window.WebSocket
    &&3 === window.WebSocket.CLOSED) {
// hurra !
}

我在Chrome、Firefox(成功的地方)和Android浏览器(失败的地方)上测试了它。希望它能帮助那里的一些人。

谢谢你的链接。如果我理解正确,就没有“WebSocket版本”或类似的标题,然后我应该编写特殊代码来手动检测使用的版本,对吗?没错。(RFC的后续草稿中有一个版本头,但Chrome和Safari中都没有合适的头。)我有一个简单的websocket服务器,它使用Sec-websocket-Key1头推断hixie-76(Safari),使用Sec-websocket头推断RFC 6455(Chrome)。这是不正确的。对于大于等于Hybi.10的任何内容,头文件都由Chrome、Firefox、WebKit Nightly和IE10发送。。Sec WebSocket版本。他们确实发送了8或13个。但是,旧Hixie-76不存在此标题。。但是唯一一个仍然在那个不推荐的版本上的是Safari。Webkit每晚都有RFC6455。查看:单击不同浏览器的案例1.1.1,向下滚动至WebSocket握手。免责声明:我是Autobahn的作者,为Tavendo工作。@oberstet,最初的问题是关于如何编写一个可以与Chrome和Safari(桌面和移动)对话的websocket服务器。我以为很多iOS浏览器仍然使用Hixie-76。你是说iOS现在使用Hybi-10+吗?如果是,您知道这是从哪个版本开始的吗?(我已经看过你的网页,但这些信息并不是很明显。)不,WebKit每晚(截至2012年3月)都会讲RFC6455。我不知道这是否会出现在iOS上。如果你想在手机上运行,这不是一个真正的选项。同意@kybernetikos。在移动浏览器推出采用最新协议的版本之前,您必须同时支持旧协议和当前协议。