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