Node.JS通过Socket.IO发送错误的数据

时间:2013-04-11 10:51:05

标签: javascript node.js socket.io

我正在使用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>

0 个答案:

没有答案