如果我继续聊天,我可以聊天。如果我离开2-3分钟后WebSocket连接关闭而没有握手错误消息,我将不知道如何处理。
任何人都可以帮助处理异常。我附上了崩溃日志,这是我的代码。
单击缩略图以查看完整错误
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}");
}
}
答案 0 :(得分:0)
理想情况下,完成WebSocket的工作后,您需要使用以下内容将其关闭:
await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "closing websocket", CancellationToken.None);
那应该解决问题。或者,一旦打开WebSocket
,就不要重新创建它。我在上面的帖子中看不到客户端创建代码,但是我作了一个假设,无论出于何种原因,它都试图重新制作WebSocket
,但是它已经有一个现有的连接,并且这样会引发错误。