处理“ System.Net.Websocket-Exception:远程方在未完成关闭握手的情况下关闭了连接”。

时间:2019-06-25 07:35:18

标签: c# xamarin xamarin.forms websocket xamarin.android

如果我继续聊天,我可以聊天。如果我离开2-3分钟后WebSocket连接关闭而没有握手错误消息,我将不知道如何处理。

任何人都可以帮助处理异常。我附上了崩溃日志,这是我的代码。

Crash Report   

单击缩略图以查看完整错误


public async void ConnectToServerAsync()
{
    await client.ConnectAsync(new Uri("ws://api.testurl.com/ws"), CancellationToken.None);


    UpdateClientState();

    await Task.Factory.StartNew(async () =>
    {
        Refresh();
        while (client.State == WebSocketState.Open)
        {
            WebSocketReceiveResult result;
            var message = new ArraySegment<byte>(new byte[4096]);
            var allBytes = new List<byte>();
            do
            {
                result = await client.ReceiveAsync(message, CancellationToken.None);   

                for (int i = 0; i < result.Count; i++)
                {
                    allBytes.Add(message.Array[i]);
                }

            } while (!result.EndOfMessage);
            try
            {
                Debug.WriteLine("End of Message2 :" + result.EndOfMessage);
                Debug.WriteLine("All Bytes :" + allBytes.ToString());
                // Optional step to convert to a string (UTF-8 encoding).
                var serialisedMessae = Encoding.UTF8.GetString(allBytes.ToArray(), 0, allBytes.Count);
                var msg = JsonConvert.DeserializeObject<List<ChatModel>>(serialisedMessae);
                Debug.WriteLine("Message Count :" + msg.Count);
                if (Chatlist.Count != msg.Count)
                {
                    Chatlist.Clear();
                    foreach (var item in msg)
                    {
                        var details = new ChatModel()
                        {
                            Message = item.Message,
                            MessageFrom = item.MessageFrom,
                            MessageTo = item.MessageTo,
                            RoomId = item.RoomId,
                            _id = item._id,
                            TimeStamp = item.TimeStamp.ToLocalTime()
                        };
                        Chatlist.Insert(0, details);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Invalide message format. {ex.Message}");
            }
        }
    }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

    void UpdateClientState()
    {
        OnPropertyChanged(nameof(IsConnected));
        sendMessageCommand.ChangeCanExecute();
        Console.WriteLine($"Websocket state {client.State}");
    }
}

1 个答案:

答案 0 :(得分:0)

理想情况下,完成WebSocket的工作后,您需要使用以下内容将其关闭:

await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "closing websocket", CancellationToken.None);

那应该解决问题。或者,一旦打开WebSocket,就不要重新创建它。我在上面的帖子中看不到客户端创建代码,但是我作了一个假设,无论出于何种原因,它都试图重新制作WebSocket,但是它已经有一个现有的连接,并且这样会引发错误。

相关问题