WebSockets:让Safari使用pywebsockets Apache扩展

WebSockets:让Safari使用pywebsockets Apache扩展,safari,websocket,Safari,Websocket,我试图在pywebsocket的帮助下让WebSocket在Apache服务器上运行。 服务器现在已经安装好,我可以通过Chrome建立Websocket连接。然而,当我尝试通过Safari建立连接时,我得到了一个“意外响应代码:404”,并且似乎无法与服务器建立WebSocket连接 这里的任何指点都将不胜感激。下面是我为建立连接而调用的客户端JS代码,以及safari头标记与Chrome头标记的对比 function connect() { if ('WebSocke

我试图在pywebsocket的帮助下让WebSocket在Apache服务器上运行。 服务器现在已经安装好,我可以通过Chrome建立Websocket连接。然而,当我尝试通过Safari建立连接时,我得到了一个“意外响应代码:404”,并且似乎无法与服务器建立WebSocket连接

这里的任何指点都将不胜感激。下面是我为建立连接而调用的客户端JS代码,以及safari头标记与Chrome头标记的对比

    function connect() {
        if ('WebSocket' in window) {
            socket = new WebSocket("ws://localhost/mystream");
        } else if ('MozWebSocket' in window) {
            socket = new MozWebSocket("ws://localhost/mystream");
        } else {
            return;
        }

    socket.onopen = function () {
        showResult('Opened');
    };
    socket.onmessage = function (event) {
        showResult(event.data);
    };
    socket.onerror = function () {
        showResult('Error in connection');
    };
    socket.onclose = function (event) {
        var logMessage = 'Closed (';
        if ((arguments.length == 1) && ('CloseEvent' in window) && (event instanceof CloseEvent)) {
            logMessage += 'wasClean = ' + event.wasClean;
            if ('code' in event) {
                logMessage += ', code = ' + event.code;
            }
            if ('reason' in event) {
                logMessage += ', reason = ' + event.reason;
            }
        } else {
            logMessage += 'CloseEvent is not available';
        }
        showResult(logMessage + ')');
  };

  showResult('Successfully Connected ');
}
Safari标题:

Origin: http://192.168.1.8
Sec-WebSocket-Key1: 26 ~ 5 75G3 36< 0 U8T
Connection: Upgrade
Host: localhost
Sec-WebSocket-Key2: 1<A   9 4 4l865P5/6L5
Upgrade: WebSocket
Connection:Upgrade
Host:localhost
Origin:http://192.168.1.8
Sec-WebSocket-Key:IAkX9XGWsCZHPQepzYjwxA==
Sec-WebSocket-Version:13
Upgrade:websocket
(Key3):00:00:00:00:00:00:00:00

已更新

这些Safari头用于协议的旧版本:Hixie-76。Hixie-76对于与web服务器的集成不太友好,因为在头文件之后会发送特殊数据(key3)。我怀疑Safari将在下一两个版本中更新到新版本的协议(HyBi)


HyBi-76握手发生在中,您可以尝试添加一些调试来尝试找出失败的地方。特别要确保“获取”质询实际上是获取在标题之后发送的质询的最后8个字节(键3)(这是使在web服务器中处理Hixie-76变得复杂的部分)。

现在设法让它工作起来。Safari(5.1)和mobile Safari都需要Hixie-75标志,该标志在pywebsockets中具有实验性支持。问题在于apache conf文件中的条目,该条目应该是全小写的(即on),但示例条目的大小写是CamelCase(on)。还原为所有小写字母已经解决了这个问题。

根据PyWebSocket站点上的文档,Hixie-76似乎在websocket协议实现列表中得到了支持。是的,PyWebSocket肯定支持Hixie-76。但是pywebsockets有两种模式:独立模式和mod_python模式。这是Hixie-76的第二种模式。您也可以尝试独立运行pywebsockets进行比较。现在已成功使其工作。Safari(5.1)和mobile Safari都需要Hixie-75,它在pywebsockets中具有实验性支持。问题在于apacheconf文件中的条目,它应该是全小写的,但是示例条目中有它。