Удаленная сторона закрыла соединение с websocket, не завершив рукопожатие

#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:

Вероятно, мне следует опубликовать решение. У меня был этот код в отдельном классе, который я мог вызвать. Однако использование этого кода в форме / окне заставляет его работать, не знаю почему.