Javascript 如何在NodeJ中可靠地维护连接的套接字阵列?
设想一个web套接字服务器。当我收到一个连接时,我需要将该连接保存在它所属的池中(将该池视为“对等方”的“房间”)。这是必要的,因为我需要向同一池的对等方广播内容 当然,这些代码都是异步的,即使节点是单线程的,维护一个全局数组似乎也不可靠(尽管我不确定这是怎么可能的…):在压力测试期间,消息非常快速地流到服务器,我将连接保存在结构中,但下一条消息通常不会发现该结构(仍然?)已更新,行为不稳定 应用程序使用Redis,但无法序列化套接字 通信基于WebSocket,通过SockJS(我在上一次迭代中使用了Socket.io) 我相信这是一个众所周知的问题,而且已经解决了,但我仍然看不到问题的真相:我在这里遗漏了什么 我的Sessions对象或多或少是这样的(不仅仅是一个伪代码……它要复杂得多)Javascript 如何在NodeJ中可靠地维护连接的套接字阵列?,javascript,node.js,sockets,concurrency,Javascript,Node.js,Sockets,Concurrency,设想一个web套接字服务器。当我收到一个连接时,我需要将该连接保存在它所属的池中(将该池视为“对等方”的“房间”)。这是必要的,因为我需要向同一池的对等方广播内容 当然,这些代码都是异步的,即使节点是单线程的,维护一个全局数组似乎也不可靠(尽管我不确定这是怎么可能的…):在压力测试期间,消息非常快速地流到服务器,我将连接保存在结构中,但下一条消息通常不会发现该结构(仍然?)已更新,行为不稳定 应用程序使用Redis,但无法序列化套接字 通信基于WebSocket,通过SockJS(我在上一次迭代
我不确定我是否理解您遇到的确切问题,但下面是一个维护套接字池的服务器示例。一旦连接,套接字就可以发送消息,这些消息只能广播到其指定的池中,我相信您正试图实现这一点。此外,当客户端断开连接时,它也会将自身从池中移除
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);