我试图在pywebsocket的帮助下在Apache服务器上运行WebSocket。服务器现在设置好了,我可以通过Chrome浏览器进行Websocket连接。然而,当我试图通过Safari建立连接时,我得到一个"意外响应代码:404",并且似乎没有WebSocket连接能够与服务器建立。
这里的任何指示将是感激的。下面是我调用的客户端JS代码,以建立连接和safari头标签vs 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 Headers:
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
Chrome Headers:
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(5.1)和移动Safari都需要Hixie-75标志,它在pywebsockets中具有实验性支持。问题是apache配置文件中的条目,该条目应该是小写的(即在上),但样本条目在CamelCase中(在上)。
更新
这些Safari标头适用于协议的旧版本:Hixie-76。Hixie-76对于与web服务器的集成不太友好,因为在报头之后发送了特殊数据(key3)。我猜想在下一个或两个版本中,Safari将更新到该协议的新版本(HyBi)。
HyBi-76握手发生在handshake/hybi00.py中,您可以尝试添加一些调试来尝试找出失败的地方。特别是要确保_get_challenge实际上获得了在报头之后发送的挑战的最后8字节(key3)(这是使在web服务器中处理Hixie-76变得复杂的部分)。