是否需要手动ping消息来检测WebSocket客户端和/或服务器断开连接

iklwldmw  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(175)

我正在使用WebSockets,并且需要客户端和服务器能够最终注意到对方是否断开连接。
我的印象是,这是自动处理的ping帧的封面下,这似乎是备份的类似问题的stackoverflow -见herehere
然而,微软的文档称
当客户端由于连接丢失而断开连接时,不会自动通知服务器
我不明白这些碎片是怎么联系起来的。如果ping/pongs是自动发送的,为什么客户端失去连接时服务器不被通知?
是客户端发起ping,从而注意到是否没有pong返回和断开连接/抛出,从而服务器不会自动抛出,如果它没有收到任何来自客户端的ping?不然我该怎么解释呢?

hivapdat

hivapdat1#

你链接到的这些问题可能有点误导,因为它们似乎是从客户端的Angular 来说话,而不是从服务器的Angular 来说话,服务器的工作方式有点不同。
确实,当客户端从WebSocket断开连接时,服务器不会自动得到通知,但是你可以通过再次调用.NET Core的ReceiveAsync并检查CloseStatus来确定:
即使客户端永远不会向服务器发送消息,您仍然需要调用ReceiveAsync。也就是说,假设您想知道客户端何时断开连接!我发现了一个很难的方法,除非你一直调用ReceiveAsync,否则CloseStatus不会更新。
引用自https://www.codetinkerer.com/2018/06/05/aspnet-core-websockets.html
例如,客户端在JavaScript中调用webSocket.send(“hello”)并不意味着服务器将接收消息。.NET Core服务器必须调用ReceiveAsync才能接收hello消息。断开连接也是如此。服务器必须调用ReceiveAsync来知道客户端是否断开连接。
客户端(即JavaScript)知道它是否失去了连接,这很容易:只需在WebSocket close和/或error事件上放置一个侦听器。
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

相关问题