私はここでフォーラムを閲覧しましたが、これは私が見つけた最も近い質問でした:
WebSockets hybi 08+ でデータ フレームを (デ) 構築する方法は?
違いは、ハンドシェイクを成功させることができないことです。握手が完了するまで、フレーミングはロールを再生しないと仮定していますが、これは正しいですか?
Chrome が、HyBi 10 Websocket プロトコル ( https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-10 ) を使用するバージョン 14 に便利に更新されたときに、概念実証を開始しようとしていました。ハンドシェイクに関する仕様の情報 ( https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-10#section-5.2.2 ) に基づいて、Sec を正常に作成できました。 -WebSocket-Accept キー (例に基づく成功) ですが、クライアント側では socket.onopen 関数は起動しません。
前回、WebSocket プロトコルのハンドシェイクで問題が発生しましたが、これは正しいバイトでハンドシェイクを終了する際の問題でした (文字の方が正確だと思いますか?)。私は現在の実装に PHP を使用しています。つまり、Python または C# の実装をデコードしようとしていますが、これまでのところ成功していません。
Chrome 14(Windows用)で実行されているクライアント側のJavascriptは次のとおりです。
var socket;
socket = new WebSocket(host);
socket.onopen = function(msg){
// process onopen
};
socket.onmessage = function(msg){
// process message
};
socket.close = function(msg){
// process close
};
そして、これがハンドシェイク用のサーバー側 PHP コードです。
function dohandshake($user,$buffer){
// getheaders and calcKey are confirmed working, can provide source if desired
list($resource,$host,$origin,$key,$version) = $this->getheaders($buffer);
$request = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: WebSocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: " . $this->calcKey($key) . "\r\n";
socket_write($user->socket,$request);
$user->handshake=true;
return true;
}
クライアントが最初のハンドシェイクを送信すると、Javascript ソケットは無期限に CONNECTING 状態のままになります。これは、onopen が起動されないことを意味するため、ソケットは未解決のままです。デバッグ方法、または私のハンドシェイクアプローチをよりよく確認する方法の両方に関するアイデアは素晴らしいでしょう。
Pythonでの明らかな(確実に機能するかどうかはわかりません)ソリューションを次に示します(https://github.com/kanaka/websockify/blob/master/websocket.py)。do_handshake メソッドを探します。
ありがとう!