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 port
和 pong timeout
公开 ping
方法
- 在添加
websocket handler
时添加一个具有可配置超时的 websocket keepalive 选项。
- 在添加
websocket handler
时添加具有可配置超时的 TCP keepalive 选项。
目前,您可以每隔 N 秒向客户端发送一条您选择的消息,并等待超时为 T 的响应。如果您没有收到回复,您可以假设连接丢失并关闭它。
我在 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 port
和pong timeout
公开 - 在添加
websocket handler
时添加一个具有可配置超时的 websocket keepalive 选项。 - 在添加
websocket handler
时添加具有可配置超时的 TCP keepalive 选项。
ping
方法
目前,您可以每隔 N 秒向客户端发送一条您选择的消息,并等待超时为 T 的响应。如果您没有收到回复,您可以假设连接丢失并关闭它。