WebSocketアプリケーションをテストしようとして問題が見つかりました。私のサーバーはDelphi7で作成されており、クライアントブラウザを接続しようとしています。
Chromeは「draft-ietf-hybi-thewebsocketprotocol-06」プロトコルを使用し、Safariは「draft-ietf-hybi-thewebsocketprotocol-00」プロトコルを使用していることを知っています。だから、私は両方の詳細を行いました。
そのため、Chromeでクライアントコードを実行すると、正常に動作します。eハンドシェイクがブラウザに受け入れられるようになりました。その後、両側との間でメッセージを送受信できます。
しかし、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)に何か問題があったことです。しかし、Webで検索すると、「Echo Test」(http://www.websocket.org/echo.html)があるWebSocket.orgWebサイトが見つかりました。私が見つけた中で最も好奇心が強いのは、通常のテストを行ったところ、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>
ありがとう!