【问题标题】:Determine who (client or server) opened a socket in NodeJS确定谁(客户端或服务器)在 NodeJS 中打开了一个套接字
【发布时间】:2022-10-23 20:42:37
【问题描述】:

仅给定一个Socket(来自node:net),我将如何确定这是由连接到我的应用程序的远程客户端创建的Socket,还是Socket是客户端?换句话说,是否有某种方法可以检查 Socket 是客户端还是服务器端?

【问题讨论】:

  • 如果您的应用程序已经打开了套接字,它还记得这个事实吗?
  • 这是一个图书馆。我正在制作一个函数,它将套接字作为参数并将事件处理程序应用于套接字,基于哪个是服务器,哪个是客户端。我目前正在传递一个额外的boolean,表明它是否是客户端,但我只是想知道是否有更优雅的解决方案,我可以使用Socket 中已经存在的一些信息来确定这一点。

标签: node.js


【解决方案1】:

同一个套接字既可以是服务器(监听传入的 HTTP 请求),也可以是客户端(发出传出的 HTTP 请求),如下面的代码所示:

http.createServer(function(req, res) {
  http.get("http://localhost:8081", {localPort: 8080})
  .on("response", function(r) {
    res.write(`Client port ${req.client.remotePort}, server port 8080
`);
    r.pipe(res);
  });
}).listen(8080);
http.createServer(function(req, res) {
  res.end(`Client port ${req.client.remotePort}, server port 8081
`);
}).listen(8081);

请求GET http://localhost:8080 然后绘制响应

Client port 53778 (the browser), server port 8080 (socket as server)
Client port 8080 (socket as client), server port 8081 (second server)

然后你的问题可以归结为:套接字首先是作为服务器还是作为客户端创建的?我认为标准的 Node.js 库不会在它们创建的套接字中留下痕迹。但是您可以自己将布尔指示器放入套接字中,而不是将其作为额外参数传递给您的库函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2014-04-06
    • 2011-11-15
    相关资源
    最近更新 更多