Вверх ↑
Ответов: 4671
Рейтинг: 767
#1: 2014-08-07 22:29:27 ЛС | профиль | цитата
Я, например, не представляю, как это сделать в режиме DataType=dtStream. Как это можно сделать в режиме dtString я описывал в теме о новых TCP компонентах.

Основная сложность - отслеживание начала-конца данных.
То-есть: шлешь, например, команду "отправляю файл такого-то размера" ("атрибуты"). Затем начинаешь отправлять файл. На принимающей стороне происходит серия событий onRead. Причем, эти события выдают данные определенными порциями, размер которых нельзя контролировать. Принимающая сторона получает первую порцию, которая содержит "команду"+первую часть файла (нет гарантии, что 2 вызова doSend дадут два события onRead). Значит, уже нужно как-то отделять команду от собственно файла. Например, разделителем, или фиксированной длиной команды.

Соответственно, в обработчике onRead нужен сложный накопитель: накапливаем данные, пока не получим разделитель. Парсим команду. Переключаем ветку накопителя, чтобы он последующие принятые данные считал содержимым файла и сохранял на диск. Как только весь файл указанного размера получен, нужно переключить накопитель опять на ожидание команды.

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

У кого есть другие теоретические/практические соображения - выкладывайте.
карма: 26

0