Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для Flexo
10 / 9 / 5
Регистрация: 26.02.2011
Сообщений: 150

Простенький асинхронный чат. Что-то не то с кодировкой

26.02.2011, 14:24. Показов 1698. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел пример простого чата. В комплект поставки входит серверная чать и клиентская (исходник в аттаче).
Запустил, вроде все работает. При дальнейшем тестировании оказалось что если ввести логин кирилицей или просто отправлять сообщения кирилицей начинаются чудеса: тект обрезается и появляются какие-то артефакты.
Немного поэкспериментировав пришел к мысли что текст рубится каждый раз когда преобразуется из байтов в строки. Причем рубится на стороне сервера а затем и на стороне клиента когда приходит ответ от сервера.
Думаю за все эти беды отвечает следующий кусок кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public Data(byte[] data)
        {
            //The first four bytes are for the Command
            this.cmdCommand = (Command)BitConverter.ToInt32(data, 0);
 
            //The next four store the length of the name
            int nameLen = BitConverter.ToInt32(data, 4);
 
            //The next four store the length of the message
            int msgLen = BitConverter.ToInt32(data, 8);
 
            //This check makes sure that strName has been passed in the array of bytes
            if (nameLen > 0)
                this.strName = Encoding.UTF8.GetString(data, 12, nameLen);
            else
                this.strName = null;
 
            //This checks for a null message field
            if (msgLen > 0)
                this.strMessage = Encoding.UTF8.GetString(data, 12 + nameLen, msgLen);
            else
                this.strMessage = null;
        }
Но что конкретно здесь не так, разобраться не могу. Помогите пожалуйста пофиксить баг...
Вложения
Тип файла: rar TCP Chat.rar (77.9 Кб, 66 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2011, 14:24
Ответы с готовыми решениями:

Асинхронный чат
Есть клиент-сервер приложение. В самом примитвном варианте: клиент шлет строку, и через некоторое время может ее запросить. Как без...

Асинхронный чат
Здравствуйте...подскажите решение следующей задачи...делаю асинхронный чат...соединение устанавливается....и вот тут проблема... не понимаю...

Асинхронный чат. Asynchat
Хочу написать асинхронный чат. Можно ли использовать модуль asynchat и как можно с помощью него переслать данные с одного хоста на другой?

4
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
26.02.2011, 15:12
За беды отвечает public byte[] ToByte()
Короче сделай вот так и все заработает, хотя это только начало проблем )

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
        //Converts the Data structure into an array of bytes
        public byte[] ToByte()
        {
            var result = new List<byte>();
 
            //First four are for the Command
            result.AddRange(BitConverter.GetBytes((int) cmdCommand));
 
            byte[] bytesText = Encoding.UTF8.GetBytes(strMessage??"");
 
            //Add the length of the name
            if (strName != null)
                result.AddRange(BitConverter.GetBytes(strName.Length));
            else
                result.AddRange(BitConverter.GetBytes(0));
 
            //Length of the message
            if (strMessage != null)
                result.AddRange(BitConverter.GetBytes(bytesText.Length));
            else
                result.AddRange(BitConverter.GetBytes(0));
 
            //Add the name
            if (strName != null)
                result.AddRange(Encoding.UTF8.GetBytes(strName));
 
            //And, lastly we add the message text to our array of bytes
            if (strMessage != null)
                result.AddRange(bytesText);
 
            return result.ToArray();
        }
Добавлено через 12 минут
Вообще можно избавится от всех if-else, если что-то будет Null то оно просто заменится пустой строкой, т.е длина 0 как раз и будет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public byte[] ToByte()
        {
            var result = new List<byte>();
 
            //First four are for the Command
            result.AddRange(BitConverter.GetBytes((int)cmdCommand));
 
            byte[] bytesText = Encoding.UTF8.GetBytes(strMessage ?? "");
            byte[] bytesName = Encoding.UTF8.GetBytes(strName ?? "");
 
            //Add the length of the name
            result.AddRange(BitConverter.GetBytes(bytesName.Length));
            result.AddRange(BitConverter.GetBytes(bytesText.Length));
 
            //Add the name
            result.AddRange(bytesName);
            //And, lastly we add the message text to our array of bytes
            result.AddRange(bytesText);
 
            return result.ToArray();
        }
общие классы, такие как class Data лучше запихай в dll и цепляй к серверу и клиенту, таким образом будет удобно их редактировать и они всегда будут одинаковыми, а не как сейчас..
2
 Аватар для Flexo
10 / 9 / 5
Регистрация: 26.02.2011
Сообщений: 150
26.02.2011, 15:20  [ТС]
Во! Здорово. Со вторым вариантом все заработало как надо
Маленький вопрос... В этой строке
C#
1
byte[] bytesText = Encoding.UTF8.GetBytes(strMessage ?? "");
За что эти символы отвечают ?? "" ?
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
26.02.2011, 15:24
синтаксический сахар это, тоже самое что
C#
1
2
3
4
5
6
7
8
9
            byte[] bytesText;
            if (strMessage == null)
            {
                bytesText = Encoding.UTF8.GetBytes("");
            }
            else
            {
                bytesText = Encoding.UTF8.GetBytes(strMessage);
            }
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
26.02.2011, 16:51
C#
1
strMessage ?? ""
Читается так: если левый операнд равен null, тогда возвращается правый операнд, иначе левый
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2011, 16:51
Помогаю со студенческими работами здесь

Простенький чат на странице
Всем привет, столкнулся с проблемой... Я пытался создать чат по такой системе: Юзер заходит на страницу -&gt; из файла считывается текст...

Как создать простенький чат?
Помогите поже :)

Простенький чат между компьютерами
Здраствуйте, извиняюсь за вопрос (просто знаю что тут таких много) но всё же. Создал самый простенький чат между компьютерами. Пользуюсь...

Асинхронный сервер - чат, много сообщений
вобщем сделал некое подобие чата, все вроде бы хорошо - отсылает/принимает сообщения нормально от множества клиентов придумал некую...

Чат: проблемы с кодировкой
Как заставить понимать его русские символы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru