2012-05-14 15 views
0

基本的なWebチャットサーバー用にWebSocket接続を設定しました。websocket接続から特定のサーバメッセージを取り出すにはどうすればよいですか?

メッセージが受信されるたびに、それは画面に出力する関数に送信されます。

socket.onmessage = function(msg){output(msg);} 

しかし、ユーザが画面上で出力されるものではない技術的応答を誘発する接続を介してサーバに送信することができる特定の技術的なコマンドがあります。

これらのテクニカルメッセージのすぐ後に続くサーバー応答を取得するにはどうすればよいですか。

テクニカルメッセージを送信するコードブロックの直後に別のsocket.onmessageを挿入しますか?私はそれがすべての将来のメッセージを取ると思います。私はちょうどの次の1つをほしい

アイデア?

答えて

0

あなたは特別なことで、私が意味する、データをパケット化することができます文字/ sが、このような文字列を形成:

"DataNotToBeShown"+"$$"+"DataToBeShown"; //if $$ is separating character 

をそして、あなたは次のようにJavaScriptで文字列を分割することができます

var recv=msg.data.split('$$'); 

したがって、表示されないデータはrecv[0]にあり、表示するデータはrecv[1]です。しかし、あなたが望むことを使用します。

1

WebSocketsは非同期なので、受信した '次の'メッセージを取得しようとするのが適切な解決策ではありません。同時に両方の方向に飛行中に複数のメッセージが存在する可能性があります。また、Javascriptのほとんどのアクションは、非同期イベント(タイムアウトの発動、またはユーザが何かをクリックしたこと)によってトリガされます。これは、送信がいつ同期制御されるのかを意味しません。また、onmessageハンドラは永続的な設定です。設定されると、すべてのメッセージが設定されなくなるまで受信されます。あなたは、メッセージメッセージ内のデータメッセージから制御メッセージを区別する何らかの方法を持つ必要があります。また、応答と送信済みメッセージを関連付ける必要がある場合は、何らかの種類のメッセージシーケンス番号(または他の形式の一意のメッセージID)も必要になります。

例えば、これは、サーバに制御メッセージを送信し、制御し、メッセージやその他のメッセージを区別することができますメッセージハンドラを持っています

var nextSeqNum = 0; 
... 
msg = {id: nextSeqNum, mtype: "control", data: "some data"}; 
waitForMsg = nextSeqNum; 
nextSeqNum += 1; 
ws.send(JSON.stringify(msg)); 
... 
ws.onmessage = function (e) { 
    msg = JSON.parse(e.data); 
    if (msg.mtype === "control") { 
     if (msg.id === waitForMsg) { 
      // We got a response to our message 
     } else { 
      // We got an async control message from the server 
     } 
    } else { 
     output(msg.data); 
    } 
}; 
関連する問題