首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于socket.io适配器的问题

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

Stack Overflow用户
提问于 2015-08-15 08:41:27
回答 1查看 5.5K关注 0票数 1

我目前正在开发一个基于node.js的socket.io服务,该服务利用node.js集群模块在同一台机器上生成多个node.js处理器。

socket.io文档表示,如果使用多个进程,则需要使用适配器,因此,例如广播目标不仅是连接到当前进程的客户端,而且是每个进程的所有连接客户端。

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 17:07:32

这是对你问题的迟答(一年后).我相信你已经想好了,但是如果其他人只是在学习的话.

  1. 如果要跨同一台计算机上的多个node.js进程发送消息,则确实需要适配器( socket.io-redis )。目前没有其他方法来管理跨不同应用程序实例的多个套接字,有时也无法保证客户端在使用应用程序时连接到同一个实例,因此适配器为您管理套接字连接信息。
  2. 您可以对套接字进行编码以进行通信,但是一旦适配器到位(假设您的库可以很好地协同工作- 见我的相关问题 )。

socket.broadcast.emit将与所有套接字通信,但发送套接字除外。

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

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

示例:

代码语言:javascript
复制
// 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                           
    });
});

代码语言:javascript
复制
      // Client 
代码语言:javascript
复制
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 );
});

注意:(稀疏) http://socket.io/docs/rooms-and-namespaces/也提到了Socket.IO发射器库可以与适配器一起使用.我可以通过多个应用程序实例发送/接收消息,而不需要.我不知道诚实到底有什么好处。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32023053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档