Я использую сетевой поток для передачи данных из текстового поля в формах Windows, когда эти данные читаются, я записываю их в консоль, в то время как передаваемые данные выводятся нормально, кажется, создается странный пробел, которого я не был в состоянии идентифицировать как новую строку или как много пробелов.
Я попытался использовать функцию замены для замены пробелов ' ' и новых строк '\n' нулевыми символами, но это, похоже, не решило проблему, и между прочитанными данными и тем, что следует за ними, все еще существует ненормальный разрыв.
Вывод должен сказать: Джон Доу присоединился
Но вместо этого говорит:
Джон Доу
присоединился
TcpClient clientSocket = serverSocket.AcceptTcpClient();
byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
clientSocket.GetStream().Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
string dataFromClient = Encoding.ASCII.GetString(bytesFrom);
Console.WriteLine($"{dataFromClient} joined");
Вы пытались поставить ".TrimEnd('\n', '\r', ' ');" в конце вашего GetString()?
Новые строки не появляются сами по себе. Как вы Отправить строку? Возможно, вы используете WriteLine? Кстати, строки .NET имеют кодировку Unicode. Encoding.ASCII — это 7-битная кодировка US ASCII. Преобразовывая текст в US-ASCII, вы будете использовать терять для любых символов, которые не могут быть представлены в этой кодовой странице. Вместо этого используйте Encoding.UTF8 как для отправителя, так и для получателя.
Подождите, вы не используете количество байтов вернулся, вы пытаетесь преобразовать весь буфер, независимо от того, содержит он данные или нет. ` new byte[clientSocket.ReceiveBufferSize]` создает массив, заполненный нулями, что означает, что Encoding.ASCII.GetString(bytesFrom); пытается декодировать 0, как если бы они были символами
Все они теперь используют UTF8, это не решило проблему, но я рад, что теперь использую правильную кодировку, как мне получить возвращаемые числа байтов от клиента, а не всего буфера?





Ваш код пытается декодировать весь массив bytesFrom, независимо от того, содержит он данные или нет. Stream.Read не перезаписывает весь буфер, он перезаписывает только те байты, которые ему нужны, и возвращает количество байтов.
Это означает, что при первой попытке декодировать буфер вы также будете пытаться декодировать содержащиеся в нем 0. Время второй может закончиться декодированием смешанных старых и новых данных.
Вы должны изменить свой код на:
byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
using(var stream=clientSocket.GetStream())
{
var read=stream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
var text = Encoding.ASCII.GetString(bytesFrom,0,read);
Console.WriteLine("Actual Text: {0}",text);
}
Другая проблема заключается в том, что Encoding.ASCII — это 7-битная кодовая страница US-ASCII. Любой символ, не содержащийся в этой кодовой странице, будет потерян и заменен на ?. Строки .NET имеют кодировку Unicode (UTF16). Используйте как минимум кодировку UTF8 как на сервере, так и на клиенте, чтобы избежать потери данных.
Возможно, он отправляется с новой строкой (пара <CR><LF>) в конце?