Node.js + ws - websocket 意外关闭

3

我有一个使用Node.js + ws构建的服务器和一个Qt客户端。在某些情况下,websocket连接会意外关闭,我正在遇到这个问题。在我的客户端中,我迭代一系列对象并向服务器发送一系列请求。然后服务器访问数据库并将响应写回客户端。以下是(简化版的)基本服务器循环:

// ...

var httpServer = http.createServer(//params);
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ server: httpServer });

// ...

wss.on('connection', function connection(ws) {

  ws.on('message', function incoming(msg) {
    handleRequest(JSON.parse(msg), function (err, result) {
      if (err) throw err;
      ws.send(JSON.stringify(result), function ack(error) {
        if (error) throw error;
      }
    }
  });

});

如果我限制客户端请求数,一切正常。 但是,如果请求数达到临界值,数据将停止从服务器返回,并且WebSocket连接会超时。
我想知道是否需要在每次写入之前或之后清除服务器上的WebSocket? QtWebSocket具有flush()方法,但我没有在ws文档中看到这种功能。 任何想法都将不胜感激。
更新:我还应该注意到,没有向ws或wss发送错误。 数据只是停止流动。
更新2:好吧,这似乎非常明显是来自我的客户端传输超大数据包的问题,通过Wireshark跟踪,一旦超过阈值,套接字就会失效,但仅当我远程连接到服务器时才会发生。 如果服务器在我的本地子网上,超大数据包将正确传输到服务器。 有什么想法可以调试吗?
1个回答

0

我更换了其中一个路由器后,这个问题得到了解决。我认为这是旧路由器的硬件问题。这是消费级硬件,所以我希望在生产中不会出现这样的问题。这确实让我想知道互联网上有多少这样的错误存在...


1
构建实时游戏时我遇到了同样的问题。我很惊讶你在这么长的时间后回答了自己的问题。希望我不要花太长时间来调试我的游戏。除了知道wireshark跟踪有所帮助之外,我还想知道当套接字崩溃时您尝试发送的最大数据大小是多少? 我已经在这里发布了我的问题: https://stackoverflow.com/questions/45069345/how-to-know-the-reason-why-a-websocket-client-is-closed-unexpectedly - newguy
我希望我能记住这些数据包的关键大小,但自从我遇到这个问题以来已经很长时间了。我不知道你们的网络架构,但我建议确保您的服务器通过铜线连接到互联网,而不是通过无线方式。另外,我在今年1月份切换到AWS,然后再转到GCP,它们的服务器都没有出现这个问题。我真的认为这是我的旧路由器出现的问题/错误。 - Knute Knudsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接