Wakanda websocket onclose 不会在网络断开时触发

Wakanda websocket onclose not firing on network disconnect

我在 Wakanda 服务器上有一个 websocket 实现。我正在跟踪连接的浏览器服务器端。当我重新加载页面时,我按预期获得了 websocket 的 onclose 事件。

我原以为当我断开网络连接时也会触发此事件。我误会了吗?当与 websocket 客户端的网络连接丢失时,有没有办法触发函数?

作为参考,我使用的是 Wakanda 10。

为了帮助您理解问题,我将向您提供一些有关 websocket 连接的详细信息:

  • 它使用 TCP
  • 如果远程客户端(例如浏览器)正常关闭 TCP 连接,服务器会收到通知 (FIN)
  • 如果远程客户端崩溃,OS 运行 客户端应用程序通知服务器 (RST)
  • 如果服务器和客户端之间的 TCP 连接打开,即使一段时间内绝对没有数据交换,连接也将被假定为打开,除非 keepalive 被激活。
  • WebSocket 规范添加了关闭消息,因此 server/client 可以处理优雅的关闭
  • WebSocket 规范添加了 ping/pong 消息交换,但没有强加超时。来自 RFC : Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in response, unless it already received a Close frame. It SHOULD respond with Pong frame as soon as is practical.
  • 在 Wakanda 的 RFC 实现中,我们响应收到的 ping 消息,但不发送我们自己的 ping 消息

这可能是一项新功能,我们可以:

  • 通过 message portpong timeout
  • 公开 ping 方法
  • 在添加 websocket handler 时添加一个具有可配置超时的 websocket keepalive 选项。
  • 在添加 websocket handler 时添加具有可配置超时的 TCP keepalive 选项。

目前,您可以每隔 N 秒向客户端发送一条您选择的消息,并等待超时为 T 的响应。如果您没有收到回复,您可以假设连接丢失并关闭它。