2013-12-18 2 views
0

Мне нужно создать небольшое приложение, которое отправляет текстовые патроны. Поэтому я создал сервер с помощью 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, чтобы удалить все символы, которые никогда не встречаются в моих строк, которые я буду посылать ... но должен быть правильный способ сделать это ...

Любая помощь будет оценена :)

Пат.

+1

TCP представлен как поток байтов. Вот и все. Между вызовами 'Read()' и вызовами 'Write()' в этом потоке нет соответствия 1-1. Если вам нужно разбить поток байтов в сообщениях, это * ваша * ответственность (если вы не выберите абстракцию более высокого уровня), чтобы обеспечить себе возможность разделить эти сообщения друг от друга. Например. путем префикса данных с длиной, или с использованием разделителей и т. д. –

+0

Я предполагаю, что я это также реализую. Когда я отправляю строку и соединение падает, я предполагаю, что будет выбрано какое-то исключение, но с этим я действительно могу убедиться, что обработаю только тогда, когда строка была правильно передана. Благодарю. – Patrick

+0

Да, вы начали бы замечать эту проблему, как только ваш клиент отправил два сообщения, и вы заметили, что оба они пришли к одному вызову 'Read()'. –

ответ

1

изменение Try:

string request = encoder.GetString(message); 

в

string request = encoder.GetString(message, 0, bytesRead); 
+0

Спасибо, Квинтон, я понятия не имею, почему я этого не видел. Я беспокоюсь об этом уже 3 дня! – Patrick

0

Обычной практикой является использование какой-то идентификатор, который никогда не будет появляться в другом месте в строке, чтобы указать конец.

System.Text.Encoding.ASCII.GetBytes("test+++++++"); 

Все будет работать, и когда вы найдете эту последовательность вы (String.indexOf («+++++++»)) просто возвращает подстроку конечного результата.

+0

Ответ Куинтона Бернхардта - лучший способ, я не знал о перегрузке этого метода. –

Смежные вопросы