4

私はここでフォーラムを閲覧しましたが、これは私が見つけた最も近い質問でした:

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 メソッドを探します。

ありがとう!

4

4 に答える 4

5

それで、私は握手で私の特定の問題を解決しました、そしてそれはかなりお粗末でした。ハンドシェイクを閉じるには、2セットの「\ r\n」が必要でした。したがって、上記で説明したハンドシェイクの問題(Javascript WebSocketがOPEN状態にならない)を修正するには、サーバー側のPHPに次の変更を加える必要がありました(最後の\ r \ n \ r \ nに注意してください)。 :

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\r\n";
    socket_write($user->socket,$request);
    $user->handshake=true;
    return true;
}

また、将来のPHP-WebSocket愛好家のために、正規表現を使用してgetheadersのヘッダーを解析します。これは、calcKeyです。

function calcKey($key){
     $CRAZY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
     $sha = sha1($key.$CRAZY,true);
     return base64_encode($sha);
}

これが他の誰かに役立つことを願っています!メッセージフレーミングに取り組みましょう...

于 2011-08-14T15:40:56.770 に答える
1

これがこの問題に対する私の解決策です。遠い将来、このコードが機能しなくなった場合は、ここに投稿してください。

https://github.com/esromneb/phpwebsocket/blob/master/websocket.class.php

ハッカーのヒントについては、私のポッドキャストをチェックしてください! http://portforwardpodcast.com/

于 2011-10-20T03:15:58.490 に答える
0

xsockets.net は、c# でサーバー側のソリューションを提供しています。ただし、上記でやろうとしていることを実行するために、サーバー側のコードを記述する必要はありません。汎用ハンドラーを使用し、JavaScript のみを記述します。

XSockets は、クロスブラウザー機能と Silverlight とフラッシュへのフォールバックを備えた hybi10 までのマルチプロトコルをサポートしています。独自のプロトコルなどを作成する場合は、プロトコル、ハンドラー、インターセプターのプラグインもサポートします... http://youtu.be/MDz1jJJeXKI?hd=1でデモを参照してください

http://xsockets.net/Documentation/Indexのドキュメント

よろしくウッフェ

于 2011-08-14T07:28:03.247 に答える
0

もう 1 つ... JsBin で hybi10 のサポートをテストできます。すべての編集可能なコードを使用できるマルチルーム チャットがあります。

ただし、Flash と Silverlight のフォールバックはありません。

http://jsbin.com/ohitil

/ウッフェ

于 2011-08-14T07:46:58.397 に答える