Мне нужно создать небольшое приложение, которое отправляет текстовые патроны. Поэтому я создал сервер с помощью tcpListener. На моем клиенте я использую tcpClient.Отправка строки, закодированной как массив байтов, через tcpListener, новая длина строки такая же, как размер буфера
Теперь моя проблема:
data = System.Text.Encoding.ASCII.GetBytes("test"); //length of "test" is 4.
теперь я посылаю этот байтовый массив в моем приложении сервера. Там я создаю буферный массив размером 320000 байт. (Размер не имеет значения здесь)
byte[] message = new byte[320000];
bytesRead = clientStream.Read(message, 0, 320000);
ASCIIEncoding encoder = new ASCIIEncoding();
string request = encoder.GetString (message);
А вот моя проблема сейчас, в результате запроса строка имеет длину 320000. такого же размера, как мой массив байтов. Я понимаю, почему это так, но что я могу сделать, чтобы уменьшить размер до оригинала? Сейчас я использую RegEx, чтобы удалить все символы, которые никогда не встречаются в моих строк, которые я буду посылать ... но должен быть правильный способ сделать это ...
Любая помощь будет оценена :)
Пат.
TCP представлен как поток байтов. Вот и все. Между вызовами 'Read()' и вызовами 'Write()' в этом потоке нет соответствия 1-1. Если вам нужно разбить поток байтов в сообщениях, это * ваша * ответственность (если вы не выберите абстракцию более высокого уровня), чтобы обеспечить себе возможность разделить эти сообщения друг от друга. Например. путем префикса данных с длиной, или с использованием разделителей и т. д. –
Я предполагаю, что я это также реализую. Когда я отправляю строку и соединение падает, я предполагаю, что будет выбрано какое-то исключение, но с этим я действительно могу убедиться, что обработаю только тогда, когда строка была правильно передана. Благодарю. – Patrick
Да, вы начали бы замечать эту проблему, как только ваш клиент отправил два сообщения, и вы заметили, что оба они пришли к одному вызову 'Read()'. –