WebSocket 版本及向后兼容性

5
我最近几天一直在尝试使用WebSockets,并且对这项新而酷炫的技术有些混合的感受。我编写了一个简单的聊天客户端,使用的是HTML5 Labs发布的最新版本,我相信这是hybi-09草案规范的发布版。在Chrome(dev channel v14.0)中,客户端工作得很好。一切都按照预期功能。然而,在其他主流浏览器中,如支持WebSockets的FireFox(v6.0b)(是的,我打开了WebSockets功能),Safari(v5.1)等,由于某种原因无法连接。以下是我的一些客户端代码:
$(document).ready(connect);

function connect() {
    if ('WebSocket' in window) {
        websocket = new WebSocket('ws://' + window.location.hostname + ':4502/chat');
    }
    else if ('MozWebSocket' in window) {
        websocket = new MozWebSocket('ws://' + window.location.hostname + ':4502/chat');
    }
    else {
        //not supported
        return;
    }

    websocket.onopen = function () {
        //do some setup stuff
    };

    websocket.onclose = function () {
        //DOH
    };

    websocket.onmessage = function (e) {
        //Do some stuff with e.data
    };
}

还有一些(C#)服务器端代码:

static void Main(string[] args)
{
    var host = new WebSocketsHost<ReverseService>();
    host.AddWebSocketsEndpoint("ws://" + Environment.MachineName + ":4502/chat");
    host.Open();

    Console.ReadLine();
}

就像我说的,在Chrome中它连接得很好,并且按照应该的方式触发了.onopen函数。在FF和Safari中,它直接进入onclose函数而从未连接过。在FF中,我收到以下错误:

"NetworkError: 501 Not Implemented - http://localhost:4502/chat"
Firefox can't establish a connection to the server at ws://localhost:4502/chat

在Safari浏览器中:
WebSocket frame (at 4294967295 bytes) is too long.

我能想到的唯一问题就是某种向后兼容性问题。我相信Chrome 14.x实现了hybi WebSockets的第10版规范,而我认为FF 6实现了第07或08版草案,至于Safari 5.1,我不确定。如果有人知道问题所在以及如何/是否可以解决,我将不胜感激。谢谢!


感谢提供 Window 代码片段。一直在寻找一种简单的方法来编写跨平台的 JS。 - Stevko
3个回答

5
Chrome 14和Firefox 7(Aurora版本,带有“Moz”前缀但默认启用)支持协议的HyBi-10版本。所有其他本地支持WebSockets的内容仍在使用协议的Hixie-76版本。
已经有一些服务器实现支持HyBi协议,随着Chrome 14的本地支持,很快会有更多的服务器实现。有些服务器实现同时支持Hixie-76和较新的HyBi协议版本(如libwebsockets、websockify)。我并不特别惊讶微软的原型服务器实现只支持协议的一个版本(因为他们在Hixie时期没有参与进来)。
更新:
一些服务器选项:
- libwebsockets - C语言实现 - websockify - 我的Python实现。 websockify是一个将websockets转换成TCP套接字代理/桥接程序,而websocket.py是通用的websocket模块。

哇,太棒了的答案。非常感谢。:) 你有任何想法在哪里可以找到同时支持两者的服务器实现吗? - Chris

1

这里是一个WebSockets协议测试报告,列出了Chrome 14和Firefox 7/8符合最新协议规范的具体特性。

测试套件是Autobahn WebSockets的一部分,这是我自己的一个小项目,包括基于Python/Twisted的WebSockets实现,可用于编写客户端和服务器。

代码采用Apache 2.0许可,全部托管在GitHub上。


1

这是一个基于.NET的(免费)WebSocketServer,支持Hybi10和旧协议。可以在http://xsockets.net找到。

或者通过在Visual Studio 2010的Package Manager控制台中使用Install-Package XSockets将其添加到您的项目(MVC3)中(也可以考虑2008现在使用Nuget)

我使用其中一个视频作为帮助http://xsockets.net/Video/Index


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接