Проблема с кодировкой UTF-8 через WebSocket

377
04 мая 2017, 11:20

Создал ASP.NET Core чат на WebSocket'ах. При пересылке англоязычных символов - всё работает нормально, проблема начинается с пересылкой русскоязычных символов. На клиенте часть сообщения может обрезаться, например сообщение "вввввввввв" превращает "ввввв".

Иногда клиент разрывает подключение с выводом следующей ошибки в консоль:

WebSocket connection to 'ws://localhost/ws' failed: Could not decode a text frame as UTF-8.

Вот пример кода принимающего сообщения с клиента:

        var buffer = new byte[1024 * 4];
        while (socket.State == WebSocketState.Open)
        {
            var result = await socket.ReceiveAsync(buffer: new ArraySegment<byte>(buffer),
                                                   cancellationToken: CancellationToken.None);
            var socketId = WebSocketConnectionManager.GetId(socket);
            var message = $"[{DateTime.Now.ToString("HH:mm:ss")}] {socketId}: {Encoding.UTF8.GetString(buffer, 0, result.Count)}";
            await SendMessageToAllAsync(message);
        }

Отправка сообщений клиентам:

    public async Task SendMessageAsync(WebSocket socket, string message)
    {
        if (socket.State != WebSocketState.Open)
            return;
        var msg = Encoding.UTF8.GetBytes(message);
        //System.Text.
        await socket.SendAsync(buffer: new ArraySegment<byte>(array: msg,
                                                              offset: 0,
                                                              count: message.Length),
                               messageType: WebSocketMessageType.Text,
                               endOfMessage: true,
                               cancellationToken: CancellationToken.None);
    }

Находил ответы примерно по этой же теме на англоязычном stackoverflow, но там предлагалось вырезать неугодные байты из сообщений. Этот вариант мне не подойдёт.

Собственно вопрос: как преобразовать сообщение пришедшее в кодировке UTF-8 в сообщение с кодировкой UTF-8 или другой, так чтобы клиент видел понятный текст, а не иероглифы?

Answer 1

У вас проблема вот тут: buffer: new ArraySegment<byte>(array: msg, offset: 0, count: message.Length). Вы передаете столько байт, скольку у вас символов в сообщении, а не байт в буфере.

Надо брать длину у массива, а не у строки.

READ ALSO
Не открывается новое окно

Не открывается новое окно

Если значения параметров нулевые - запускается окно настроек, где должен их ввести (сохранения настроек проихводится в SettingsViewModel)Проблема:...

227
c# Подгрузка dll

c# Подгрузка dll

Добрый день, возникла такая проблема: Я использую dll в проекте C#Но когда я пытаюсь запустить exe, он не запускается ( участок кода, который использует...

223
Библиотека для музыкального плеера [требует правки]

Библиотека для музыкального плеера [требует правки]

Подскажите хорошую библиотеку для создания музыкального плеера и как установить эту библиотеку

206
RSA шифрование на C#

RSA шифрование на C#

Хочу сделать простую шифровку алгоритмом RSA встроенными вNet средствами

724