WebSocket版本和向后兼容性

Chr*_*ris 5 javascript html5 websocket

在过去的几天里,我一直在尝试使用WebSockets,而且我对新的非常酷的技术有一些不同的经验.我写了一个简单的聊天客户端,它使用HTML5实验室的最新版本,我相信是hybi-09草案规范版本.客户端在Chrome(dev通道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
    };
}
Run Code Online (Sandbox Code Playgroud)

和一些(C#)服务器代码:

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

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,它在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
Run Code Online (Sandbox Code Playgroud)

在Safari中:

WebSocket frame (at 4294967295 bytes) is too long.
Run Code Online (Sandbox Code Playgroud)

我唯一能想到的是某种向后兼容性问题.我相信Chrome 14.x实现了hybi WebSockets的10规范草案,我认为FF 6实现了07或08草案,我不确定Safari 5.1.如果有人对问题是什么和/或我是如何解决它有任何见解,我会很感激帮助.谢谢!

kan*_*aka 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是TCP套接字代理/桥接的websockets,但websocket.py是一个通用的websocket模块.