握手在Safari上不起作用,但适用于Chrome

时间:2012-03-12 19:21:38

标签: safari websocket handshake

我发现尝试测试websocket应用程序时遇到问题。我的服务器是用Delphi 7编写的,我尝试将客户端浏览器连接到它。

我知道Chrome使用“draft-ietf-hybi-thewebsocketprotocol-06”协议,Safari使用“draft-ietf-hybi-thewebsocketprotocol-00”协议。所以,我已经完成了两者的具体细节。

因此,当我在Chrome上运行客户端代码时,它运行正常,我得到了握手以便浏览器接受。之后,我可以向双方发送和接收消息。

但是,当我使用Safari浏览器运行相同的客户端代码时,它根本不起作用。我从服务器上的浏览器获得了握手,如下所示:

GET / HTTP/1.1
#$D#$A
Upgrade: WebSocket
#$D#$A
Connection: Upgrade
#$D#$A
Host: 192.168.0.1:5050
#$D#$A
Origin: http://192.168.0.1
#$D#$A
Cookie: PHPSESSID=87i5k8n2f2i6e05sesmgvv9q82
#$D#$A
Sec-WebSocket-Key1: 133r  170600  u j5
#$D#$A
Sec-WebSocket-Key2: 6"3 7#  "' 9 Z0v7Vo 011 :
#$D#$A
#$D#$A
q¯×/­“#$11ï

所以,我的服务器回答:

HTTP/1.1 101 WebSocket Protocol Handshake
#$D#$A
Upgrade: WebSocket
#$D#$A
Connection: Upgrade
#$D#$A
Sec-WebSocket-Origin: http://192.168.0.1
#$D#$A
Sec-WebSocket-Location: ws://192.168.0.1:5050/
#$D#$A
Sec-WebSocket-Protocol: chat
#$D#$A
#$D#$A
ñˆñ ÷æD‡Tí#0d+ãó-

似乎一切都好!但是客户端不接受答案并立即关闭连接。

我想到的第一件事就是我对Safari的握手答案出了问题(draft-ietf-hybi-thewebsocketprotocol-00)。但是,在网上搜索,我找到了WebSocket.org网站,他们在那里进行了“回声测试”(http://www.websocket.org/echo.html)。我发现最奇怪的是,正常测试,Chrome和Safari都运行良好。但是,保存页面上的示例代码,并在本地运行它,甚至连接到WebSocket服务器,Safari也不起作用。所以,我想有一些与Safari不同的东西。任何人都可以保存下面的代码并将其运行到两个浏览器(Safari和Chrome)中并检查它是否适用于两者?而且,有谁知道会发生什么?

<!DOCTYPE html>

<meta charset="utf-8" />
<title>WebSocket Test</title>

<script language="javascript" type="text/javascript">

var wsUri = "ws://echo.websocket.org/";
var output;

function init()
{
output = document.getElementById("output");
testWebSocket();
}

function testWebSocket() 
{
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}

function onOpen(evt) 
{
writeToScreen("CONNECTED");
doSend("WebSocket rocks");
}

function onClose(evt) 
{
writeToScreen("DISCONNECTED");
}

function onMessage(evt) 
{
writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
websocket.close();
}

function onError(evt) {
writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
}

function doSend(message) 
{
writeToScreen("SENT: " + message);
websocket.send(message);
}

function writeToScreen(message) 
{
var pre = document.createElement("p");
pre.style.wordWrap = "break-word";
pre.innerHTML = message;
output.appendChild(pre);
}

window.addEventListener("load", init, false);

</script>

<h2>WebSocket Test</h2>

<div id="output"></div>

</html>

谢谢!

0 个答案:

没有答案