我在这里遗漏了一些非常基本的东西。我有两个非常标准的带有socket io的快速进程。我正在尝试在一个进程上获取服务器广播,以将相同的消息广播到另一个服务器客户端。我有以下设置:
var server = require('http').createServer(app);
var socketio = require('socket.io')(server, {
serveClient: (config.env !== 'production'),
path: '/socket.io-client'
});
require('./config/express')(app);
require('./routes')(app);
server.listen(config.port, config.ip, function () {
logger.info('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
var redis = require('socket.io-redis');
var adapter = redis({ host: config.redis.uri, port: config.redis.port });
adapter.pubClient.on('error', function(){
logger.error('Error on pub client');
});
adapter.subClient.on('error', function(){
logger.error('Error on sub client');
});
socketio.adapter(adapter);
require('./config/socketio')(socketio);
然后我的socket io文件是:
module.exports = function (socketio) {
//listen to other server broadcasts
socketio.on('socket.io#/#', function(data) {
logger.debug('received message from other process');
});
//client connection code
socketio.on('connection', function (socket) {
socket.address = socket.handshake.address !== null ?
socket.handshake.address + ':' + socket.handshake.address.port :
process.env.DOMAIN;
socket.connectedAt = new Date();
// Call onDisconnect.
socket.on('disconnect', function () {
onDisconnect(socket);
logger.debug('[%s] DISCONNECTED', socket.address);
});
// Call onConnect.
onConnect(socketio, socket);
logger.debug('[%s] CONNECTED', socket.address);
});
};
从其他服务器我只是调用标准的发射
socketio.emit('message', object);
在调试方面,我加载redis cli并检查创建的通道:
1) "socket.io#/#"
2) "socket.io-sync#request#/#"
我甚至在cli中运行SUBSCRIBE "socket.io#/#"
并且可以看到我正试图通过cli显示的其他服务器上的消息。
这看起来很基本,如何正确订阅redis频道'socket.io#/#'
上的活动?
编辑:所以我发现如果我这样做,我会在其他进程上收到消息
socketio.sockets.adapter.subClient.on('message', function (channel, message) {
logger.warn('GOT STUFF ');
});
然而,我只是直接去redis子客户端。通道和消息只是不可用数据的缓冲区。这不是要提供更高级别的抽象吗?
编辑2 :我现在“大部分”都在工作。这样做:
socketio.sockets.adapter.subClient.on('message', function (channel, message) {
logger.warn('GOT STUFF ');
socketio.sockets.in(channel).emit(message);
});
打开套接字接口将直接获取通道和消息缓冲区。现在转到我的下一个问题,而不是socketio.emit(message, doc);
我想要这样做socketio.sockets.in(doc._id).emit('message;, doc);
。基本上我只希望它在那个房间的一部分的客户端结束。似乎没有按原样工作......