【问题标题】:Node.js + ws - websocket is unexpectedly closingNode.js + ws - websocket 意外关闭
【发布时间】:2015-12-21 06:11:04
【问题描述】:

我有一个 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 文档中没有看到这种功能。任何想法将不胜感激。

更新:我还应该注意,不会向 wswss 发送任何错误。数据只是停止流动。

更新 2:好的,这似乎很明显是通过 Internet 从我的客户端传输超大数据包到 node+ws 服务器的问题。根据 Wireshark 跟踪,一旦达到超大阈值,套接字就会失效,但只有当我远程连接到服务器时。如果服务器在我的本地子网上,超大的数据包会正确传输到服务器。有什么想法可以调试吗?

【问题讨论】:

    标签: node.js websocket qt5


    【解决方案1】:

    在我更换了一台路由器后,此问题得到解决。我将此归结为旧路由器的硬件问题。这是消费级硬件,所以我希望这不应该成为生产中的问题。这确实让我想知道有多少这样的错误可能会在互联网上闲逛......

    【讨论】:

    • 我在构建实时游戏时遇到了同样的问题。我很惊讶你在这么长时间后回答了你自己的问题。我希望调试我的游戏不会花费我太长时间。除了知道wireshark跟踪有帮助之外,我还想知道当套接字失效时您尝试发送的最大数据大小是多少?我在这里发布了我的问题:stackoverflow.com/questions/45069345/…
    • 我希望我能记住数据包的临界大小,但我已经很久没有看到这个问题了。我不知道您的网络架构,但我会确保您的服务器通过铜线而不是无线连接到 Internet。此外,我在今年 1 月切换到 AWS,然后是 GCP,他们的服务器都没有出现问题。我真的认为这是我的旧路由器的问题/错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2020-08-26
    • 2015-07-22
    • 2016-11-15
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多