如何在 Node.js 中获取现有服务器的实例?
Posted
技术标签:
【中文标题】如何在 Node.js 中获取现有服务器的实例?【英文标题】:How to get an instance of an existing server in Node.js? 【发布时间】:2020-08-01 02:42:17 【问题描述】:我想获取在我的本地机器上运行的几台服务器的连接数。
我已经在通过net.createServer()
创建的服务器上成功使用了server.getConnections()
,但是我不知道如何在已经启动的服务器上使用它。
我尝试通过使用net.connect()
连接到服务器实例来获取它。连接创建成功,我得到一个新的net.Socket
对象,但我的理解是我实际上需要一个net.Server
才能使用getConnections()
。
所以我的问题是,我如何获得一个已经在运行的服务器的net.Server
实例?
【问题讨论】:
您是否想让客户端询问服务器它有多少连接?你不能通过与服务器交谈来做到这一点(除非服务器导出这样的 API),你需要询问操作系统。 @root 如何询问操作系统? 这取决于操作系统。在 Linux 上,这是lsof
或 netstat
。
【参考方案1】:
我知道我的问题是一个 XY 问题,所以向所有试图回答它的人道歉。
我怀疑“我如何获得现有服务器的实例”这个字面问题的答案是:“你不能”。
我应该为这个问题添加更多细节,尤其是我想要达到的目标。
我的应用程序是负载平衡器/反向代理服务器。最初我能够使用getConnections()
,因为我会从同一个脚本启动代理服务器和一些虚拟服务器。但是我想让虚拟服务器和代理彼此分开,所以即使我确实可以完全控制它们,我也需要假装我实际上并不拥有这些服务器。
最后,我针对我的具体情况找到的解决方案是保留我可以连接到的服务器的哈希列表(通过反向代理),并在每次连接到特定服务器时增加连接计数器:
let servers = [
port: 4000, connectionsCounter: 0 ,
port: 5000, connectionsCounter: 0 ,
port: 6000, connectionsCounter: 0 ,
];
let myProxyServer = net.createServer((socket) =>
// Open a connection to the first server in the list
net.connect(servers[0].port, () =>
// Once connected, increment the connections counter
socket.on('connect', () =>
servers[0].connectionsCounter++;
);
// When the connection ends, decrement the counter
socket.on('close', () =>
servers[0].connectionsCounter--;
);
);
);
我希望这对某人有所帮助。
【讨论】:
【参考方案2】:如果您只想使用服务器,您可以在调用 net.createServer() 时将其存储为变量
const my_server = net.createServer();
// do what you want with it
my_server.getConnections();
my_server.listen();
【讨论】:
我可以为已经在我的机器上运行的服务器执行此操作吗?即,我可以获取对它的引用而不是创建它(最好通过host:port
)?【参考方案3】:
您可以创建net.createServer()
的实例,然后从server.on('connection', <callback>)
获取您的连接数:
server.on('connection', (socket) =>
// someone connected
console.log("New active connection");
server.getConnections((err, count) =>
if(err)
console.log(err);
else
console.log("Currently " + count + " active connection(s)");
);
);
我希望这个完整的示例代码对您有所帮助:
const net = require('net');
const uuid = require('uuid/v1');
const server = net.createServer((socket) =>
socket.uuid = uuid();
socket.on('data', (data) =>
//const response = JSON.parse(data.toString('utf8'));
);
socket.on('error', (err) =>
console.log('A client has left abruptly !');
server.getConnections((err, count) =>
if(err)
console.log(err);
else
console.log("Currently " + count + " active connection(s)");
);
);
socket.on('end', () =>
console.log("A client has left");
server.getConnections((err, count) =>
if(err)
console.log(err);
else
console.log("Currently " + count + " active connection(s)");
);
);
);
server.on('error', (err) =>
// handle errors here
console.log("Error:", err);
);
server.on('connection', (socket) =>
// someone connected
console.log("New active connection");
server.getConnections((err, count) =>
if(err)
console.log(err);
else
console.log("Currently " + count + " active connection(s)");
);
);
// port number.
server.listen(3000, () =>
console.log('opened server on', server.address());
);
或者您可以使用 netstat 获取连接数,https://www.npmjs.com/package/node-netstat nodejs 模块用于此解决方案:
const netstat = require('node-netstat');
myObject =
protocol: 'tcp',
;
setInterval(function ()
let count = 0;
netstat(
filter:
local: port: 3000, address: '192.168.1.1'
, item =>
// console.log(item);
count++;
console.log(count);
);
, 1000);
【讨论】:
我试过这个,但我得到错误代码EADDRINUSE
,因为服务器已经在我的系统上运行。假设我无法控制最初创建服务器的原始代码,有没有办法获得它的实例?
我不确定您是否可以在不访问原始代码的情况下对其进行实例化,但您可以使用 netstat。 npmjs.com/package/node-netstat => 你可以在 nodejs 中使用这个模块和 setInterval 计时器,然后你可以在你的特定端口上获取连接数,请参阅我的更新代码以了解这个解决方案
我奖励你的答案,因为即使它没有回答我的问题,它也有一些有价值的见解【参考方案4】:
你的申请有点不清楚。
只有服务器套接字可以报告它有多少连接。这就是为什么如果您创建net.Server
,您可以从中访问该信息。
如果您想连接到应用程序并查询连接到该应用程序的客户端数量,则您连接到的应用程序需要在您询问时向您提供该信息。这不是套接字提供的信息 - 应用程序本身必须提供该信息。
如果您正在编写创建 net.Server
的应用程序,您可以在不同的端口上创建另一个 net.Server
,然后您可以连接到该端口并在其其他套接字上查询有关其他客户端的信息。
如果您试图一般地查找到具有套接字的特定应用程序的连接数,该应用程序需要能够告诉您,或者,正如@root 所提到的,您需要询问应用程序正在运行的操作系统在。此功能将取决于操作系统,并且可能需要提升的权限。但请考虑连接到路由器或物联网设备上的套接字:该应用程序可能根本不在任何操作系统上运行。
【讨论】:
以上是关于如何在 Node.js 中获取现有服务器的实例?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS Lambda 中使用 Node.js 列出我的所有 Amazon EC2 实例?
在 Mongoose (mongodb node.js) 中,如何更新现有值并插入缺失值,而不删除未指定的值?