2011-12-20 52 views
0

我使用Node.js v0.6.0及更高版本(使用RedisStore)提供的本地集群功能运行Socket.io多线程。带集群的Socket.io:遍历所有打开的连接

对于状态的每个新变化,服务器遍历每个连接并在适当的情况下发送消息。 注意:这不是“广播”到所有连接,它将服务器数据与客户端在连接上发送的数据进行比较,以决定是否将服务器数据发送到该特定客户端。考虑下面的代码示例:

io.sockets.clients().forEach(function (socket) { 
    socket.get('subscription', function (err, message) { 
    if(message.someProperty === someServerData) { 
    socket.emit('position', someServerData); 
    } 
}); 

这时候,只有一个进程,但是现在,客户端收到的每个节点的过程(消息精细的工作,即如果有8个节点进程在运行,所有的客户端接收消息8次)。

我明白为什么会出现问题,但我不确定是否有修复。我怎样才能从一个进程到客户端分配一对一的关系。也许使用Cluster的NODE_WORKER_ID的东西?

This previous这个问题似乎有点相关,虽然我不确定这有帮助。

这似乎是一个相当普遍的要求。当然,我一定错过了什么?

+0

究竟是什么你想在这里做什么?以某种方式验证用户或..什么? – alessioalex 2011-12-20 15:37:24

+0

@alessioalex服务器正在阅读长长的航班位置,并向订购该航班的客户发送位置更新(例如,客户订购AWE150,并且将接收所有与AWE150相关的新职位)。因此,对于每个新位置,Node服务器遍历所有打开的连接并将该位置转发给适当的连接。也许我的做法是错误的? – 2011-12-20 15:56:06

+0

@David Chouinard你为什么不使用房间?客户端x加入房间'AWE150',当你为此数据做'io.sockets.to('AWE150')。emit('position',somedata)' – 3rdEden 2011-12-20 16:28:19

回答

1

所以,如果我得到这个直,你需要从服务器发出自定义事件。您可以通过创建自己的自定义EventEmitter和对发射器触发事件​​,例如做:

var io = require('socket.io').listen(80); 
    events = require('events'), 
    customEventEmitter = new events.EventEmitter(); 


io.sockets.on('connection', function (socket) { 
    // here you handle what happens on the 'positionUpdate' event 
    // which will be triggered by the server later on 
    eventEmitter.on('positionUpdate', function (data) { 
    // here you have a function that checks if a condition between 
    // the socket connected and your data set as a param is met 
    if (condition(data,socket)) { 
     // send a message to each connected socket 
     // if the condition is met 
     socket.emit('the new position is...'); 
    } 
    }); 
}); 

// sometime in the future the server will emit one or more positionUpdate events 
customEventEmitter.emit('positionUpdate', data); 

另一种解决办法是让这些用户加入“AWE150”,所以只有他们将获得“AWE150更新”,像这样:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    if (client_is_interested_in_AWE) { socket.join('AWE150'); } 
    io.sockets.in('AWE150').emit('new position here'); 
}); 

资源:

http://spiritconsulting.com.ar/fedex/2010/11/events-with-jquery-nodejs-and-socket-io/

+0

是的!这对群集有很大的意义和适用性。谢谢,非常感谢。 – 2011-12-20 18:17:32

+0

没问题,我总是乐于帮忙。 – alessioalex 2011-12-20 18:18:07