【问题标题】:questions about socket.io adapters关于 socket.io 适配器的问题
【发布时间】:2015-11-08 11:26:18
【问题描述】:

我目前正在开发基于 node.js 的 socket.io 服务,该服务利用 node.js cluster module 在同一台机器上生成多个 node.js 进程。

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

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

【问题讨论】:

    标签: node.js socket.io socket.io-redis


    【解决方案1】:

    这是对您问题的迟到回答(一年后)...我敢肯定您现在已经想通了,但是如果其他人刚刚学习的话...

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

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

    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-emitter 库...我能够在多个应用程序实例之间发送/接收消息而无需...我不确定说实话有什么好处。

    【讨论】:

    • 发射器用于没有实例化 socket.io 服务器的节点进程,例如。对于纯粹的工作人员
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多