19

WebSocketでサーバーとメッセージを送受信できます。サーバーにデータを送信し、サーバーからの応答を待機し、関数の結果としてそれを返す関数を作成する必要があります。

送信:

ws.send('my_message_to_server');

受信(イベントです):

ws.bind('message', function(message) {
console.log(message);
});

私の機能:

function request(message){
ws.send(message);
    //How wait for receive???
    return response;
}
4

5 に答える 5

20

少し前にオンラインゲームで使った素敵な方法がありますが、サーバー側のものも変更する必要があります!

最初にデータを送信する関数を作成します

var socketQueueId = 0;
var socketQueue = {};

function sendData(data, onReturnFunction){
    socketQueueId++;
    if (typeof(returnFunc) == 'function'){
        // the 'i_' prefix is a good way to force string indices, believe me you'll want that in case your server side doesn't care and mixes both like PHP might do
        socketQueue['i_'+socketQueueId] = onReturnFunction;
    }
    jsonData = JSON.stringify({'cmd_id':socketQueueId, 'json_data':data});
    try{
        webSocket.send(jsonData);
        console.log('Sent');
    }catch(e){
        console.log('Sending failed ... .disconnected failed');
    }
}

次に、サーバー側で要求を処理するときに、応答とともに cmd_id をクライアントに送り返す必要があります。

webSocket.onmessage = function(e) {

    try{
        data = JSON.parse(e.data);
    }catch(er){
        console.log('socket parse error: '+e.data);
    }

    if (typeof(data['cmd_id']) != 'undefined' && typeof(socketQueue['i_'+data['cmd_id']]) == 'function'){
        execFunc = socketQueue['i_'+data['cmd_id']];
        execFunc(data['result']);
        delete socketQueue['i_'+data['cmd_id']]; // to free up memory.. and it is IMPORTANT thanks  Le Droid for the reminder
        return;
    }else{
        socketRecieveData(e.data);
    }
}

他のすべてのタイプの返品を処理する関数を作成します。

socketRecieveData(data){
    //whatever processing you might need
}

したがって、サーバーにデータを送信し、その特定のデータの応答を待ちたい場合は、次のようにします。

sendData('man whats 1+1', function(data){console.log('server response:');console.log(data);});
于 2014-06-10T15:36:41.883 に答える
4

Websocket を作成するときは、通常、クライアントがサーバーからデータを受信するたびに呼び出される onmessage コールバック関数をソケットに追加します。

 var socket = new WebSocket("ws://example.com:8000/websocketapp.php");  
 socket.onmessage = function(msg){
      alert('The server says: ' + msg);
 }

サーバーが応答するまでブロックする機能は、概念的には悪い考えです。サーバーからの応答が返されるまでスクリプトの実行が停止することを意味するためです。サーバーがビジーでネットワークの待ち時間が長い場合、これには数秒かかることがあります。そのため、コールバック関数 (イベントが発生したときに呼び出される関数) を使用することをお勧めします。

一度に 1 つの要求のみをサーバーに送信することを保証できる場合は、socket.onmessage 関数を、サーバーの応答を処理してそれに基づいて動作する関数に変更するだけです。

 socket.onopen = function() {
    socket.send("What's your name?");
    socket.onmessage = function(message) {
        alert("The server says its name is " + message); 
        socket.send("What is the answer to life, the universe and everything?");
        socket.onmessage = function(msg){
             alert("The server says the answer is: " + msg);
        }
     }
 }

(ちなみに: 読みやすくするために、返信ハンドラを設定する前にリクエストを書きました。逆に、最初に返信ハンドラを設定してからリクエストを送信する方がよいでしょう。これは、可能性は低いが不可能ではない場合に重要です。サーバーの応答が速すぎてハンドラーがまだセットアップされていない場合)。

ただし、複数の並列リクエストがあり、サーバーが参照しているリクエストを見つける必要がある場合は、より良いものが必要になります。たとえば、メッセージを識別し、各メッセージを専用のメッセージ ハンドラー関数に転送する onmessage 関数を使用できます。

于 2012-11-16T14:00:45.087 に答える
2

WebSocket の上である種の RPC プロトコルを使用する必要があります。RPC および PUB/SUB セマンティクスを追加する WebSocket サブプロトコルであるWAMPをご覧になることをお勧めします。promise ベースの API を提供することで、非同期接続をある程度抽象化するクライアント ライブラリが含まれています。

次に例を示します。

var wsuri = "ws://localhost:9000";

ab.connect(wsuri, function (session) {
    session.call("http://example.com/simple/calc#add", 23, 7).then(
        function (res) {
            console.log("got result: " + res);
        },
        function (error, desc) {
            console.log("error: " + desc);
        }
    );
});

これには多くのサーバー側の実装があります。

于 2012-11-16T14:27:30.947 に答える
2

WebSocket は TCP のようなもので、単なるトランスポート層です。必要なのは、webSocket の上でプロトコルを実行することです。プロトコルは、メッセージ間の相関関係を作成します。リアルタイム非同期メッセージング用の最も広範で完全なオープン プロトコルである AMQP を検討することをお勧めします。シンプルな AMQP クライアント JS ライブラリについては、たとえばhttps://github.com/dansimpson/amqp-jsを参照してください。

使用しているサーバーの種類はわかりませんが、多くのプラットフォームで AMQP が多数サポートされているため、AMQP を使用すると最も柔軟性が高くなります。シンプルな AMQP メッセージ ブローカーの実装もあります。サーバーが Java の場合は、JMS を検討する必要があります。その場合、より精巧で堅牢な JMS ブローカーが必要になります。

于 2012-11-17T01:22:00.010 に答える