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