Ответы с форумов MSDN

Передача файлов по сети в .NET

Date: 09.01.2019 17:19:07

Слишком сложно. Если ваша цель - передать строку, вы должны создать на основе NetworkStream объект BinaryWriter и передать на вход его метода Write строку. На принимающей стороне создать объект BinaryReader и вызвать его метод ReadString. Аналогично для других типов. В итоге код должен получиться раза в 3 проще, и проблема с неполной передачей строк отпадет.

Message 314

Date: 09.01.2019 19:10:13

Файлы, разумеется, не нужно передавать через строки. Корректный алгоритм передачи файла выглядит как-то так:

Передача

1. Передать размер файла

2. Передать содержимое файла (без разницы как, но предпочтительно не очень большими порциями, чтобы не упасть из-за нехватки памяти)

Прием

1. Получить размер файла

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

3. Прервать цикл, когда считано необходимое количество байт, или когда Read вернул 0 (последнее означает преждевременный разрыв соединения).


Message 313

Date: 09.01.2019 19:11:38

"А раз файлы будут передаваться через массив байт, то нет смысла передавать строки. Проще передавать массивы байт и переводить их в строки на стороне клиента. Ведь так?"

Нет, строки нужно передавать именно "через строки". Что заставляет вас думать иначе? 

Message 312

Date: 10.01.2019 3:05:42

Если файлы передаются не целиком, а отдельными блоками, вам нужно применить тот же алгоритм, но не к целому файлу, а к его блокам. В остальном суть не меняется, должно быть циклическое считывание и соединение полученных массивов, пока не наберется полный блок. А не просто, "один раз прочитали, если пришло мало - упали с ошибкой", этот подход некорректен.

Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub