2

我正在使用 Node.JS 和 Socket.IO 来交易数据。我有以下“模式”:

  • 一个“本地”Socket.IO 服务器,它的 setInterval 为 10 秒,在每次迭代中广播不同的数据。
  • “全局” Socket.IO 服务器,根据 HTML 客户端的请求,从“本地”服务器接收数据(以下代码中的 ioLocal 变量是 socket.io-client),使用传递的数字修改数据HTML 客户端请求并发送到客户端。

问题是 HTML 客户端正在接收错误的数据。想象一下,对于时间戳,本地服务器广播消息“2”。同时,两个不同的 HTML 客户端请求数据,第一个请求“2”,第二个请求“3”。预期的是第一个收到“4”(2 * 2),第二个收到“6”(2 * 3),但不工作。相反,第一个接收“4”,第二个接收“12”(4*3)。如果我有第三个客户端发送“2”,它将收到“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