Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Проблема с передачей файлов по сети


Автор: cmL 26.3.2009, 13:32
Написал приложение для передачи фалов по сети с помощью TServerSocket и TClientSocket. Всё работает, но есть одно НО... Во время передачи среднего размера фалов (5 и более Mb) клиент зависает до окончания передачи. Я уверен, что это из-за того, что для передачи и принятия файла в оперативной памяти выделяется размер = размеру передаваемого файла. Помогите решить проблему, либо подскажите другой надёжный способ передачи.
 
P.S. Написал я это приложение на основе http://www.winsov.ru/delphi062.php. 

Автор: kami 28.3.2009, 12:37
1. Используй не TMemoryStream, а TFileStream.
2. Очень смущает 
Код

Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size);

В реальных условиях не будет такого, чтобы 5 и более мегабайт отправились сразу за 1 send. Значит, нужно будет использовать "досылку" данных в сокет, когда он передаст первую часть данных. А в примере не используется событие OnClientWrite (буфер сокета свободен и в него можно добавить данные).
2. Статья  не освещает некоторые вопросы. Прочитай http://www.delphimaster.ru/articles/socksrv/index.html по крайней мере раздел "Почему несколько блоков при передаче могут обьединяться в один" - обязательно.

Автор: cmL 28.3.2009, 19:14
kami, спасибо большое советы.

Автор: kami 28.3.2009, 20:29
Цитата(cmL @  28.3.2009,  19:14 Найти цитируемый пост)
А вот статья - полный бред, с кучей ошибок

Статья не бред, а вот насчет кода - соглашусь, есть такое. Но с другой стороны это заставляет подумать головой, чтобы заставить всё хозяйство работать smile

Самое главное, что оттуда можно подчерпнуть (ну, по крайней мере я подчерпнул smile ) - это принцип работы с TCP - нужно буферизировать данные и на передающем и на приемном конце, иначе ничего хорошего не выйдет.


Цитата(cmL @  28.3.2009,  19:14 Найти цитируемый пост)
сам повозился с пол-часа

Это очень хорошо, что всего с пол-часа, большая удача для изучения чужого кода smile. Зато разобрался, что к чему.

Автор: cmL 28.3.2009, 20:34
Да всё в порядке smile . Я конкретно лоханулся со своей статьей: передавать файлы с помощью MemoryStream, гг это ж надо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)