我发现尝试测试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>
谢谢!