нет. не нормально.
попробую объяснить проблему.
Теоретически:
клиент шлёт запрос на поиск допусти всех файлов *.txt на сервере.
Сервер начинает поиск. Нашёл первый файл и отправил его клиенту.
Клиент получает и добавляет имя и путь файла в listbox.
Практически:
С Сервером всё нормально. Посылает по одному файлу за раз.
А вот с Клиентом...
Вот код процедуры, которая принимает соообщения:
try
{
// Заканчивает чтение данных в readBuffer и возвращает кол-во прочитанных байт
lock (Client.GetStream())
{
BytesRead = Client.GetStream().EndRead(ar);
}
if (BytesRead < 1)
{
// TO_DO!!! если ничего не было прочитано то server закрыт. Отметить, что разъединено в catch
// MarkAsDisconnected();
return;
}
// конвертируем в кодировку UTF8 и отнимаем 2 байта: Chr(13) и Chr(10)
strMessage = Encoding.UTF8.GetString(readBuffer, 0, BytesRead - 2);
//fl.WriteLine(strMessage);
// анализируем команды
ProcessCommands(strMessage);
// заново начинаем чтение
Client.GetStream().BeginRead(readBuffer, 0, READ_BUFFER_SIZE, new AsyncCallback(DoRead), null);
}
Первый раз всё нормально, в strMessage содержиться ровно одно имя и путь файла (структура такова — "FOUNDFILE|путь и имя файл|"). А вот потом в strMessage начинают накапливаться имена и пути файлов, т.е. типа такого "FOUNDFILE|файл1|FOUNDFILE|файл2|FOUNDFILE|файл3|FOUNDFILE|файл4|FOUNDFILE|файл5|FOUNDFILE|файл6|FOUNDFILE|файл7|"
и всё бы ничего, но это последовательность в строке может прерваться в самый неподходящий момент, например на середине файла или команды...
Так вот как избежать такого?
Как мне быть уверенным, что приметься только "FOUNDFILE|путь и имя файл|" и всё.
Как сделать, чтобы не накапливалась строка?
Делать огромный буфер на приём (да и то не факт...)?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение