【问题标题】:How to detect Websocket disconnection in .Net/C#?如何在 .Net/C# 中检测 Websocket 断开连接?
【发布时间】:2021-10-08 01:41:34
【问题描述】:

我有一个 .Net/C# 服务器。客户端通过 websockets 连接到服务器。

我想从服务器检测客户端失去互联网连接的情况。

我在一个循环中包含以下代码,该循环通过 Web 套接字读取来自客户端的数据

Dim WS as Websocket 'Websocket Created somewhere else...
Dim MemoryStream As New MemoryStream()
Dim Result As WebSocketReceiveResult = Nothing
Dim Buffer As ArraySegment(Of Byte) = New ArraySegment(Of Byte)(New Byte(20000) {})

Do
    Try
        Result = Await WS.ReceiveAsync(Buffer, CancellationToken.None)
    Catch Ex As WebSocketException
        'Some exception handler
    End Try
    
    If WS.State <> WebSocketState.Open Then     '<< Break point A
        RaiseEvent Disconnected(Me)   '<<<<<< Raise websocket disconnected event
    End If

    MemoryStream.Write(Buffer.ToArray, Buffer.Offset, Result.Count)

    If Result.EndOfMessage = True Then Exit Do            
Loop

'Do something                                   '<< Break point B

为了测试代码,我几乎在所有地方都放置了断点,然后我连接了一个客户端。客户端连接后,我为他切断了互联网连接。

很遗憾,没有命中断点来检测 Websocket 断开连接事件。

我想知道在 C# 或 .Net 中是否有办法检测 websocket 对象何时断开

谢谢 问候,

【问题讨论】:

  • 您需要立即知道的任何特定原因(尤其是在服务器端),而不是在您第一次尝试发送实质性内容但失败时?

标签: c# vb.net websocket


【解决方案1】:

我终于明白了。

当互联网连接丢失时,前面的代码可以工作。但是,您必须等待 20 分钟才能从 websocket 获取异常。 20 分钟对于检测断开连接的用户来说非常长。所以我最终每 x 秒使用一次 ping 进程来检测这种情况。

【讨论】:

  • 这是设计使然。事实上,在确定存在连接中断之前,TCP 连接可能会持续数小时。理论上,如果您在连接丢失时没有发送数据,那么无论如何它都没有关系。 Web Socket 协议中实际上指定了一个 ping/pong。因此,如果您最终在顶级应用程序级别执行此操作,您可能能够在您的 C# 服务器上实现。另见:developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/…
【解决方案2】:

阅读精美的手册,在我看来,您会得到一个异常,您已经为其编写的处理程序,或者返回的 WebSocketReceiveResult(您的 Result 对象)将有一个 CloseStatus 枚举。如果您真的要拔出网络电缆,我不会指望立即做出反应。您可能需要等待一段时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2019-06-23
    • 2013-02-10
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多