Socket.io Redis服务器广播

时间:2016-09-24 16:30:02

标签: node.js sockets express redis socket.io

我在这里遗漏了一些非常基本的东西。我有两个非常标准的带有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);。基本上我只希望它在那个房间的一部分的客户端结束。似乎没有按原样工作......

0 个答案:

没有答案