WebSocketException (0x80004005): 远程方在没有完成关闭握手的情况下关闭了 WebSocket 连接

Ars*_*han 9 c# visual-studio websocket xamarin

我有一个使用 WebSocket 进行通信的 Xamarin 应用程序。在客户端,我引用了ClientWebSocket.

代码:

using (var client = new ClientWebSocket() { Options = { KeepAliveInterval = new TimeSpan(0,0,3,0) }})
{
    try
    {
        await client.ConnectAsync(requestUri, cancellationToken);
        do
        {
            WebSocketReceiveResult result = null;
            var buffer = new byte[ReceiveChunkSize];
            var message = new ArraySegment<byte>(buffer);
            do
            {
                result = await client.ReceiveAsync(message, cancellationToken);
                var receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
                data.Append(receivedMessage);
                if (result.MessageType != WebSocketMessageType.Text)
                    break;

            } while (!result.EndOfMessage);

            TranslateData(data);
        } while (client.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested);
Run Code Online (Sandbox Code Playgroud)

应用程序断断续续地抛出:

 System.Net.WebSockets.WebSocketException (0x80004005): The remote
 party closed the WebSocket connection without completing the close
 handshake.
Run Code Online (Sandbox Code Playgroud)

服务器有一个测试网站,它似乎按预期运行。看来问题出在客户端上。在该值client.StateOpen

Mar*_*kus 2

如果有人仍然像我一样发现这个问题......

我有同样的问题,我添加了这个检查

result = await client.ReceiveAsync(message, cancellationToken);

if (result.Count == 0) {
    break;
}
Run Code Online (Sandbox Code Playgroud)

以某种方式获取零字节也意味着服务器终止了连接或出现了问题......

我在 WebSocket 周围添加了一个计时器来对连接进行 ping -> pong 类型检查。当然,这只有在您也控制服务器端代码的情况下才有可能。在服务器端,这可以帮助您检测死连接。

对我有帮助的链接是:

https://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html

https://social.msdn.microsoft.com/Forums/vstudio/en-US/77bda5ed-0d52-4305-9a20-438e69dc2cb0/c-advanced-socket-server-100-cpu-usage-after-some-time?论坛=csharpgeneral

并且 - 就像 aleha_84 所写的那样。循环中的异常也应该触发重新连接。