0

想象一个 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 ...

}
4

1 回答 1

0

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

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);
于 2013-04-10T22:44:54.903 回答