关于 socket.io 个适配器的问题

questions about socket.io adapters

我目前正在开发基于 node.js 的 socket.io service that makes use of the node.js cluster module,以便在同一台机器上生成多个 node.js 进程。

socket.io 文档说,如果使用多个进程,则需要使用 adapter,例如广播不仅针对连接到当前进程的客户端,而且针对每个进程的所有连接客户端。

  1. 我是否理解正确,即使所有进程都在本地生成(即不跨多个服务器),我也需要使用这样的适配器?
  2. 服务器进程需要不时进行通信(只是单向的,即广播消息而不需要响应)。如果正在使用这样的适配器(例如 socket.io-redis),我是否也可以使用它向所有服务器进程广播?或者适配器仅用于连接的客户端?

这是对你问题的迟到答案(一年后)......我相信你现在已经明白了,但如果其他任何人刚刚学习遇到这个......

  1. 如果你想在同一台机器上跨多个 node.js 进程发送消息,你确实需要一个适配器 ( socket.io-redis )。目前没有其他方法可以管理跨不同应用程序实例的多个套接字,有时无法保证客户端在使用该应用程序时连接到同一实例,因此适配器会为您管理该套接字连接信息。

  2. 一旦适配器就位,您就可以编写套接字进行通信(假设您的库可以很好地协同工作 - )。

socket.broadcast.emit 将与 所有 套接字通信 除了 发送套接字

io.sockets.emit 将与 所有 个套接字通信

socket.emit 将仅与该套接字通信

示例:

// Server

var redisPort = 6379
var io = require('socket.io');
var redisAdapter = require('socket.io-redis');

io = io.listen( httpServer ); //the server instance ( supply your own code here )

io.adapter( redisAdapter({ host: 'localhost' , port : redisPort }) );//6379
io.on('connection', function( socket ){
    
    socket.on('client-msg', function( data ){
        var msgObject = { content : '' , status : 0 };
        if( data && data.content ){
            msgObject.content = data.content;
            msgObject.status = 1;
        }
        
        io.emit('server-response', msgObject );//send to all sockets
        socket.emit( 'server-response', msgObject );//send to this socket
        socket.broadcast.emit( 'server-response', msgObject ); //send to all other sockets but not this one
    
    });
    
    socket.on('disconnect', function( data ) { 
        //do some stuff unrelated to emitting                           
    });
});

// 客户
var socketio = io.connect( window.location.origin  , { transports : ['websocket'] } );

socketio.emit("send-message" , { content : msg  });

socketio.on("server-response", function( data ) {
    console.log( data.content , data.status );
});

注意:(稀疏)socket.io docs 还提到了一个 socket.io-发射器库可以与适配器一起使用...我能够 send/receive跨多个应用程序实例的消息没有那么...我不确定说实话有什么好处。