Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在NodeJ中可靠地维护连接的套接字阵列?_Javascript_Node.js_Sockets_Concurrency - Fatal编程技术网

Javascript 如何在NodeJ中可靠地维护连接的套接字阵列?

Javascript 如何在NodeJ中可靠地维护连接的套接字阵列?,javascript,node.js,sockets,concurrency,Javascript,Node.js,Sockets,Concurrency,设想一个web套接字服务器。当我收到一个连接时,我需要将该连接保存在它所属的池中(将该池视为“对等方”的“房间”)。这是必要的,因为我需要向同一池的对等方广播内容 当然,这些代码都是异步的,即使节点是单线程的,维护一个全局数组似乎也不可靠(尽管我不确定这是怎么可能的…):在压力测试期间,消息非常快速地流到服务器,我将连接保存在结构中,但下一条消息通常不会发现该结构(仍然?)已更新,行为不稳定 应用程序使用Redis,但无法序列化套接字 通信基于WebSocket,通过SockJS(我在上一次迭代

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

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

应用程序使用Redis,但无法序列化套接字

通信基于WebSocket,通过SockJS(我在上一次迭代中使用了Socket.io)

我相信这是一个众所周知的问题,而且已经解决了,但我仍然看不到问题的真相:我在这里遗漏了什么

我的Sessions对象或多或少是这样的(不仅仅是一个伪代码……它要复杂得多)


我不确定我是否理解您遇到的确切问题,但下面是一个维护套接字池的服务器示例。一旦连接,套接字就可以发送消息,这些消息只能广播到其指定的池中,我相信您正试图实现这一点。此外,当客户端断开连接时,它也会将自身从池中移除

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);
var net=require('net');
var util=require('util');
var currentPool=1;
var server=net.createServer();
//将新套接字添加到存储在侦听服务器实例上的分配池
server.addtopol=函数{
如果(!server.connPools){
server.connPools={};
}
如果(!server.connPools[s.poolId]){
server.connPools[s.poolId]=[];
}
server.connPools[s.poolId].push;
s、 打开('close',clientCloseHandler);
s、 在('data',clientDataHandler)上;
};
//将数据从客户端广播到池中的其他客户端
函数clientDataHandler(数据){
对于(var a=0;a
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);