【问题标题】:How to reliably maintain an array of connected sockets in nodejs?如何在nodejs中可靠地维护一组连接的套接字?
【发布时间】:2013-04-10 21:09:17
【问题描述】:

想象一个 Web 套接字服务器。当我收到一个连接时,我需要将该连接保存在它所属的池中(将池视为“对等点”的“房间”)。这是必需的,因为我需要向同一个池的对等方广播内容。

当然,代码都是异步的,即使 Node 是单线程的,维护全局数组似乎也不可靠(不过我不确定这怎么可能……):在压力期间测试,消息流向服务器的速度非常快,我将连接保存在结构中,但通常下一条消息没有发现该结构(仍然?)更新,行为不正常。

应用使用Redis,但是socket不能序列化...

通信基于 WebSockets,通过 SockJS(我在之前的迭代中使用了 Socket.io)。

我确信这是一个众所周知且已经解决的问题,但我仍然没有看到亮光:我在这里缺少什么?

我的 Sessions 对象或多或少是这样的(不仅仅是伪代码......它比那复杂得多)。

var Sessions = {

   sockets: {},

   add: function(poolId, socket) {
     sockets[poolId].push(socket);
   },

   find: function(poolId) {
     return sockets[poolId];
   },

   remove: function ...

}

【问题讨论】:

    标签: javascript node.js sockets concurrency


    【解决方案1】:

    我不确定我是否理解您遇到的确切问题,但这里有一个维护套接字池的服务器示例。连接后,套接字可以发送仅广播到其分配的池的消息,这就是我相信您正在尝试完成的事情。此外,当客户端断开连接时,它会将自身从池中移除。

    var net = require('net'); 
    var util = require('util');
    
    var currentPool = 1;
    var server = net.createServer();
    
    //add a new socket to the assigned pool stored on the listening server instance
    server.addToPool = function(s){
      if(!server.connPools){
        server.connPools = {};
      }
    
      if(!server.connPools[s.poolId]){
        server.connPools[s.poolId] = [];
      }
    
      server.connPools[s.poolId].push(s);
    
      s.on('close', clientCloseHandler);
      s.on('data', clientDataHandler);
    
    };
    
    //broadcast data from client to other clients in their pool
    function clientDataHandler(data){
    
      for(var a=0; a < server.connPools[this.poolId].length; a++){
        server.connPools[this.poolId][a].write(data);
      }
    
    }
    
    //remove client form pool on disconnect
    function clientCloseHandler(){
      var tmp = null;
      for(var a=0; a < server.connPools[this.poolId].length; a++){
        if(this.remotePort === a.remotePort){
          tmp = a;
          break;
        }
      }
      server.connPools[this.poolId].splice(tmp,1);
    }
    
    //add new client to pool
    function newClient(s){
      s.poolId = currentPool;
      server.addToPool(s);
    
      if(currentPool === 1){
        currentPool = 2;
      }else{
        currentPool = 1
      }
    
    }
    
    server.on('connection', newClient);
    
    server.listen(9999);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2012-05-06
      • 2017-07-24
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多