握手不';不适用于Safari,但适用于Chrome

握手不';不适用于Safari,但适用于Chrome,safari,websocket,handshake,Safari,Websocket,Handshake,我在测试websocket应用程序时发现了一个问题。我的服务器是用Delphi7编写的,我尝试将客户端浏览器连接到它 我知道Chrome使用“draft-ietf-hybi-thewebsocketprotocol-06”协议,Safari使用“draft-ietf-hybi-thewebsocketprotocol-00”协议。所以,我已经为这两个项目做了详细说明 所以,当我在Chrome上运行客户端代码时,它工作正常,我得到了浏览器接受的握手。之后,我可以收发双方的信息 但是,当我使用Saf

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

我知道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网站,在那里他们有“回声测试”()。我发现最奇怪的是,在进行正常测试时,Chrome和Safari都运行良好。但是,保存页面上的示例代码,并在本地运行,甚至连接到WebSocket服务器,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>

网袋试验
var wsUri=“ws://echo.websocket.org/”;
var输出;
函数init()
{
输出=document.getElementById(“输出”);
testWebSocket();
}
函数testWebSocket()
{
websocket=新的websocket(wsUri);
websocket.onopen=函数(evt){onopen(evt)};
websocket.onclose=函数(evt){onclose(evt)};
websocket.onmessage=函数(evt){onmessage(evt)};
websocket.onerror=函数(evt){onerror(evt)};
}
功能开启(evt)
{
写屏(“连接”);
doSend(“网岩”);
}
函数onClose(evt)
{
写屏(“断开”);
}
消息函数(evt)
{
writeToScreen('响应:'+evt.data+'');
websocket.close();
}
函数onError(evt){
writeToScreen('错误:'+evt.data);
}
函数doSend(消息)
{
writeToScreen(“已发送:+消息”);
发送(消息);
}
功能写入屏幕(消息)
{
var pre=document.createElement(“p”);
pre.style.wordWrap=“断开单词”;
pre.innerHTML=消息;
输出.appendChild(pre);
}
addEventListener(“加载”,init,false);
网袋试验

谢谢

服务器响应包含Sec WebSocket协议头,但客户端请求不包含。如果这不是输入错误,它将导致连接请求失败。您应该只发送此头来回显客户端请求的子协议(当然,假设您支持该子协议)。请发布用于生成响应的代码。特别是如何计算要响应的哈希值。