0

私はNodeJSでsocket.ioを使用する初心者ですが、クライアント(Webページ)/サーバープログラムをコーディングして、クライアント側でいくつかの統計データをレンダリングしました。要件は次のようなものです–ボックス統計をレンダリングする(多くのうち)。ユーザーは複数のブラウザウィンドウを開くことができるため、1つのボックスデータを何度も要求できるシナリオがあります。

http://www.tool.com?boxname=box1

そのため、同じボックスに対する複数のリクエストに対して1つのジョブを生成することを実現したいと思います。以下は、要件を満たすために実装したロジックです。

クライアント側:

  1. データチャネルを作成するサーバーへの接続を確立します。

    socket.on(boxname.toLowerCase()、function(data){}

したがって、私が受け取ったboxnameイベントにデータがあるときはいつでも、データを解析してレンダリングします。

サーバ側

  1. まず、expectスクリプトを呼び出して、ボックスの無限ループ内で実行するスクリプトをコピーします。

  2. ボックス内のスクリプトが正常にコピーされたら、別のexpectスクリプトを呼び出して実行を開始します。

    exports.ServiceMonitor = function(boxName、res){

ステップ1。

リクエストが何度も来るので、スクリプトをコピーする必要があります。そうしないと、以下に説明するように、スクリプトの実行を開始するこの生成されたプロセスの「exit」イベントに入ることができません。

var child = spawn('./scripts/copyscriptonbox.sh' , [boxName.toLowerCase(), getURL(boxName)]);

コードの後半では、グローバルとして宣言されているboxnames変数にボックス名を追加し続けます。したがって、新しいboxnameリクエストで-boxnames変数でboxnameの出現回数を検索します。カウントが1以上の場合、そのボックスでスクリプトがすでに実行されていることを意味します。

        var noofbox = boxnames.split(boxName.toLowerCase()).length - 1;

        child.on('exit', function (code) {
                logger.info('child stream exit: ' + code);
                if(code == 0)
                {
                        boxNames +=  boxName.toLowerCase();
                        logger.info('Box name added: ' + boxNames);
                        res.render('boxpage', {}); //render a web page
                        io.sockets.on('connection', function (socket) {
            logger.info('Connected to box :' + boxName);
            if(noofbox <= 0)            
                           schild = spawn('./scripts/boxmon.sh', [boxName.toLowerCase(), getURL(boxName)]);
                        schild.on('exit', function (code) {
                                logger.info('schild stream exit.');
                         });
                        schild.stderr.on('data', function (data) {
                                logger.info('stderr: ' + data);
                        });
                        schild.stdout.on('data', function (data) {
                              //generate response
                        });
                        socket.on('disconnect',function(){logger.info('Disconnect Killed');ServiceMonitorEnd(boxName.toLowerCase());});
                        });
                }
        });
}

問題は、2つのブラウザウィンドウでURLにアクセスした場合:www.tool.com?boxname = box1-最初はログを1回だけ取得しますが(ボックスに接続:box1)、2回目は同じログを2回取得します。私はそれが1回であることを期待していました-つまり、最初のリクエストの後にログが何度も印刷されるので、多くのリクエストが届きます– 5の場合、ログは1(1回目)+2(2回目)+ 3(3回目)で印刷されます時間)+4(4回目)+5(5回目)?'connection'イベントがx回呼び出されると、接続ごとにその回数入ることを理解しています。リクエストごとに1回だけsocket.ioで「接続」イベントを作成するにはどうすればよいですか?

4

1 に答える 1

0

socket.onceの代わりに使用しますsocket.on。これは、.onのような別のEventEmitterであり、最初に1回だけ発行されます。ドキュメントを確認してください。ただし、その後、そのようなイベントはクライアントによって受信されないことを覚えておいてください。

于 2013-02-26T18:26:03.717 に答える