Проблема в том, что символ в C # представляет 2-байтовый символ UTF-16. Символ кириллицы в UTF-16 больше 255, поэтому вы теряете информацию при преобразовании его в байт.
Чтобы преобразовать строку в байтовый массив, используйте класс Encoding:
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(Console.ReadLine());
Чтобы преобразовать его обратно в строку на конце получателя, напишите:
string message = System.Text.Encoding.UTF8.GetString(buffer);
Другая проблема заключается в том, что Stream.Read не гарантирует одновременное чтение всех байтов вашего сообщения (ваш поток не знает, что вы отправляете пакеты определенного размера). Например, может случиться так, что последний байт полученного байтового массива будет только первым байтом двухбайтового символа, и вы получите другой байт при следующем вызове Stream.Read.
Существует несколько решений этой проблемы:
- Обернуть поток в StreamWriter на конце отправителя и в StreamReader на конце получателя. Вероятно, это самый простой способ, если вы передаете только текст.
- Передайте длину вашего сообщения в начале вашего сообщения в виде целого числа. Это число говорит получателю, сколько байтов он должен прочитать.