0

基本的な Web チャット サーバー用に WebSocket 接続をセットアップしました。

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

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

ただし、ユーザーが接続を介してサーバーに送信できる特定の技術コマンドがあり、画面に出力することを意図していない技術的な応答を引き出します。

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

技術メッセージを送信するコード ブロックの直後に別の socket.onmessage を配置する必要がありますか? 将来のすべてのメッセージがかかると思います。私はちょうど次のものをしたいです。

アイデア?

4

2 に答える 2

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);
    }
};
于 2012-05-14T14:22:53.497 に答える
0

データをパケット化できます。つまり、特殊文字を使用して、次のような文字列を形成できます。

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

そして、次のように JavaScript で文字列を分割できます。

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

したがって、表示されないデータは にあり、表示されるrecv[0]データは にありますrecv[1]。その後、好きなように使用してください。

于 2012-05-14T23:35:00.987 に答える