#c# #asp.net #sockets #web #websocket
#c# #asp.net #сокеты #веб #websocket
Вопрос:
Я новичок в WebSockets и в настоящее время пытаюсь реализовать его для чата, который я создаю. Однако каждый раз, когда я его запускаю, я получаю сообщение об ошибке «Удаленная сторона закрыла соединение с WebSocket, не завершив рукопожатие close»..
Вот мой текущий код:
public async Task Receive(ClientWebSocket socket)
{
try
{
var buffer = new ArraySegment<byte>(new byte[2048]);
do
{
WebSocketReceiveResult resu<
MemoryStream ms = new MemoryStream();
do
{
result = await socket.ReceiveAsync(buffer, CancellationToken.None); //Errors here
ms.Write(buffer.Array, buffer.Offset, result.Count);
} while (!result.EndOfMessage);
if (result.MessageType == WebSocketMessageType.Close)
break;
ms.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(ms, Encoding.UTF8);
string text = await reader.ReadToEndAsync();
Console.WriteLine(text);
} while (true);
}
catch (Exception ex)
{
MessageBox.Show("Error - " ex.ToString());
Application.Current.Shutdown();
}
}
Он выдает ошибки при result = await socket.ReceiveAsync(buffer, CancellationToken.None);
Если вы продолжаете отправлять сообщения, это не приведет к ошибке. Однако, если вы оставите его в покое на некоторое время, примерно на 30 секунд или до минуты, в конечном итоге появится эта ошибка. Сервер запускается на VPS, и, похоже, все в порядке. Отправка сообщений тоже хороша, все ее получают. Проблема в том, что если вы оставите его в покое и некоторое время не отправляете никаких сообщений, он просто выдает исключение и выдает эту ошибку.
Комментарии:
1. Ну, ИМХО, то, что вы описываете, является ожидаемым поведением. На сервере установлен некоторый период ожидания, и если сервер не получает никаких данных в течение этого периода, он закрывает соединение.
2. @Xaver да, в конце концов я это понял. Я попытался отправить сообщения о сердцебиении на сервер, однако все мои попытки не увенчались успехом.
Ответ №1:
Вероятно, мне следует опубликовать решение. У меня был этот код в отдельном классе, который я мог вызвать. Однако использование этого кода в форме / окне заставляет его работать, не знаю почему.