我正在使用Node.js v0.6.0及更高版本(使用RedisStore)提供的本机群集功能运行Socket.io多线程。
对于状态中的每个新更改,服务器都会迭代每个连接并在适当时发送消息。 注意:这不是“广播”到所有连接,它将服务器数据与客户端在连接上发送的数据进行比较,以决定是否将服务器数据发送到该特定客户端。请考虑以下代码示例:
io.sockets.clients().forEach(function (socket) {
socket.get('subscription', function (err, message) {
if(message.someProperty === someServerData) {
socket.emit('position', someServerData);
}
});
当只有一个进程时,这工作正常,但现在,客户端收到每个Node进程的消息(即,如果有8个Node进程正在运行,所有客户端都会收到8次消息)。
我理解为什么会出现问题,但我不确定是否有问题。如何从一个进程分配一对一关系到仅在客户端上。也许是使用Cluster NODE_WORKER_ID
的东西?
This previous所以问题似乎有点相关,虽然我不确定它是否有用。
这似乎是一个非常常见的请求。当然,我一定错过了什么?
答案 0 :(得分: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/