1

我在尝试测试 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+ãó-

看来一切都OK了!但是客户端不接受答案并立即关闭连接。

我首先想到的是我对 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>

谢谢!

4

0 回答 0