【问题标题】:Closing single node server connection closes them all关闭单节点服务器连接将全部关闭
【发布时间】:2021-02-03 18:04:07
【问题描述】:

我几乎不问任何关于 Stack Overflow 的问题,但这个问题超出了我的范围。我想我缺少一些基本的东西,因为我对 Node 服务器很陌生。

我们的应用程序非常基础。服务器应该接收少量文本行(数据),合并并解析它们,一旦连接关闭(数据发送结束),它将数据发送到 api。

var net = require('net');
var fs = require('fs');
const axios = require('axios')

const server = new net.Server();
server.listen(PORT, IP);

server.on("connection", client => {
    client.write("Hello\n");
    console.log('connected');
    
    let received = "";
    client.on("data", data => {
       received += data
       console.log("Partial data is: " + data);
    });

    client.on("close", () => {
        received = received.toString('utf8');
        fs.appendFile('log.txt', received, function (err) {});

        received = received.replace(/(?:\r\n|\r|\n)/g, "||");
        axios.post(APIADDRESS, {data: received});
        console.log('Full data is: '+ {data: received});
    });
});

要发送数据,我只需使用netcat ipaddress port 运行netcatnc,这不是问题。连接正常,收到状态消息。

问题是——一旦我从两个不同的 SSH 服务器打开两个或多个连接,就会发生一些奇怪的事情。我可以一行一行地发送就好了。服务器报告“部分数据”调试没有问题,对于他们两个。 但是,一旦我关闭其中一个连接 (ctrl+c),它们都会关闭。 最后,只接收到来自手动关闭的连接的数据。另一个,来自单独 ssh 服务器上的单独 nc 似乎永远不会到达 client.on("close") 部分。它只是无缘无故地终止了。

有什么想法吗?我什至不知道从哪里开始。

//编辑 刚刚从我的电脑和一些使用单独的 SSH 服务器的 ssh 移动应用程序测试了它。一旦在任何设备上发送 ctrl+c,它就会关闭所有客户端的连接。

//忘了提我正在运行 pm2 来保持服务器正常运行。一旦我手动打开脚本,忽略 pm2 - 它工作正常。诡异的。发生这种情况是因为 PM2。

【问题讨论】:

  • 您使用的 netcat 命令行到底是什么?而且,你是从两台不同的电脑上做的吗?还是同一台计算机上有两个单独的控制台?而且,您是从哪里执行 Ctrl-C 的?
  • 我正在运行 putty,2 个不同的 ssh 服务器实例(打开了两个窗口),但只有一台计算机。我只是在其中一个控制台中执行 ctrl-c。
  • 知道腻子是否以某种方式在实例之间共享连接?也许读这个:Sharing connections with Putty

标签: javascript node.js pm2


【解决方案1】:

致未来来到这里的任何人。

如果您使用 pm2 并启用 --watch 并且文本日志文件与您的主服务器脚本位于同一文件夹中...这就是它在单个客户端后断开连接的原因断开连接。它只是检测到日志已更改。

我没有捂脸,这甚至不好笑。

【讨论】:

  • 那么,当 SSH 日志文件被修改时,pm2 正在重启你的服务器?你是说这是你的问题的原因吗?
【解决方案2】:

我猜你已经将 Putty 配置为“尽可能共享 SSH 连接”。根据一些文档,这样做时:

使用此模式时,连接到给定服务器的第一个 PuTTY 成为“上游”,这意味着它是管理真正 SSH 连接的那个。所有后续重用连接的 PuTTY 都称为“下游”:它们根本不连接到真实服务器,而是通过本地进程间通信方法连接到上游 PuTTY。

因此,如果您 Ctrl+C 管理实际共享连接的 PuTTY 会话,它们都会失去连接。

您大概可以在客户端或服务器端禁用此共享连接功能,因为必须启用两者才能进行共享。

【讨论】:

  • 我禁用了它并将其设置为上游,但是,正如我所说,这是我用于netcat 的两个完全可分离的 ssh 服务器。这是最困扰我的。我想我需要同时在两台设备上测试它,只是为了确定。
  • 不,刚刚从我的电脑和一些 ssh 移动应用程序中测试过。一旦在任何设备上发送 ctrl+c ,它就会关闭所有客户端的连接。
猜你喜欢
  • 2020-09-28
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2018-12-09
  • 2018-05-29
相关资源
最近更新 更多