2

Node.JS と Socket.IO を使用してデータを取引しています。次の「スキーマ」があります。

  • 各反復で異なるデータをブロードキャストする 10 秒の setInterval を持つ「ローカル」Socket.IO サーバー。
  • 「グローバル」Socket.IO サーバーは、HTML クライアントからの要求に応じて「ローカル」サーバーからデータを受信し (次のコードの ioLocal 変数は socket.io-client)、渡された番号でデータを変更します。 HTML クライアント要求を送信し、クライアントに送信します。

問題は、HTML クライアントが間違ったデータを受信して​​いることです。タイムスタンプの場合、ローカル サーバーがメッセージ「2」をブロードキャストするとします。一方、2 つの異なる HTML クライアントがデータを要求します。最初のクライアントは "2" で、2 番目のクライアントは "3" です。最初のものは "4" (2*2) を受け取り、2 番目のものは "6" (2*3) を受け取りますが、機能していません。代わりに、最初のものは "4" を受け取り、2 番目のものは "12" (4*3) を受け取ります。「2」を送信する 3 番目のクライアントがあった場合、「24」(12*2) を受信します。

クライアントごとに異なるvarを作成しようとしました.socket.setとsocket.get、socket.idの配列を使用しましたが、これらのソリューションはどれも機能しませんでした。

これの何が問題なのですか?範囲の問題ですか?御時間ありがとうございます。

「グローバル」サーバー

var ioGlobal = require('socket.io').listen(9090);

ioGlobal.set('log level', 1);
ioGlobal.enable('browser client minification'); // send minified client
ioGlobal.enable('browser client etag'); // apply etag caching logic based on version number
ioGlobal.enable('browser client gzip'); // gzip the file
ioGlobal.set('transports', [ 'websocket', 'xhr-polling' ]);
ioGlobal.set("polling duration", 10);
ioGlobal.set('sync disconnect on unload', true);

var ioLocal = require('socket.io-client').connect('http://10.0.0.219:9091', {
        'connect timeout' : 1500,
        'reconnect' : true,
        'reconnection delay' : 500,
        'max reconnection attempts' : 20
});
ioGlobal.sockets.on('connection', function(iSocket) {
    debug && console.log('Client '+iSocket.id+' connected.');

    iSocket.on('disconnect', function() {
        debug && console.log("Client "+iSocket.id+" disconnected.");
    });

    iSocket.on('data_rt', function(num) {

        ioLocal.on('data_broadcast', function(data) {

            //do something to data with num
            data = data*num;

            iSocket.emit('rsp_data_rt', data);
        });
    });
});

「ローカル」サーバー

var ioLocal = require('socket.io').listen(9091);
ioLocal.sockets.emit('data_broadcast', 2);

HTML クライアント

<!DOCTYPE html5>
<html>
    <head>
        <title>Socket.IO MultiClient Test</title>

        <script type="text/javascript" src="http://10.0.1.180:3000/socket.io/socket.io.js"></script>
        <script>
            var socket = io.connect('http://10.0.0.219:9090');

            function go(){
                var message = document.getElementById('message').value;
                socket.emit('data_rt', message);
            };

            socket.on('rsp_data_rt', function(num){
                    document.getElementById('result').innerHTML = num;
            })
        </script>

    </head>
    <body>
        <h1>Socket.IO Multiclient</h1>
            Message: <input type="text" id="message"><br />
            <button type="button" onclick='go()'>Send</button>
            Result: <span id="result"></span>
    </body>
</html>
4

0 に答える 0