我试图在pywebsocket的帮助下让WebSocket在Apache服务器上运行。 服务器现已设置好,我可以通过Chrome建立Websocket连接。但是,当我尝试通过Safari建立连接时,我得到一个“意外的响应代码:404”,并且似乎没有能够与服务器建立WebSocket连接。
这里的任何指针都将不胜感激。下面是我调用的客户端JS代码,以及与Chrome标头标签相关的safari标头标签。
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
Chrome标头:
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
答案 0 :(得分:1)
管理让它立即运作。 Safari(5.1)和移动游猎都需要Hixie-75标志,它在pywebsockets中有实验支持。问题在于apache conf文件中的条目,该条目应该全部小写(即 on )但是样本条目在CamelCase中有( On ) 。恢复全部小写已解决了这个问题。
答案 1 :(得分:0)
<强>更新强>
这些Safari标题适用于较旧版本的协议:Hixie-76。 Hixie-76与Web服务器的集成不太友好,因为在标头之后发送了特殊数据(key3)。我怀疑Safari会在下一个或两个版本中更新到新版本的协议(HyBi)。
HyBi-76握手发生在handshake/hybi00.py您可能会尝试添加一些调试来尝试找出失败的位置。特别要确保_get_challenge实际上获得了在标题之后发送的挑战的最后8个字节(key3)(这是使得在Web服务器中处理Hixie-76变得复杂的部分)。