Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Обмен файлами   Найти похожие ветки 

 
EvgeniyR   (2004-06-29 13:24) [0]

Здравствуйте! Как можно отправить файл с одного клиента idTCPClient другому, соответственно через idTCPServer и на клиенте-получателе сохранить его с таким же именем? Заранее благодарен.


 
False_Delirium ©   (2004-06-29 14:29) [1]

Отправляешь файл на сервер(SendBuf ? ). На сервере по событию приёма данных перенаправляешь полученные данные на соединение клиента, которому хочешь переправить файл.

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

Примерно всё так, но нужно учесть вариант, когда клиент, которому предназначен файл может внезапно оборвать соединение(копьютер перезагрузился?), тогда сервер должен "накопить" данные в своём временном буфере, пока связь с адресатом не будет восстановлена или очистить буфер через ЭНное кол-во истекшего времени.


 
alienserg   (2004-06-29 19:33) [2]

Собственно слать файл стоит с помощью WriteStream:
fileToSend:=TFileStream.Create(FFileName, fmOpenRead);
FFileSize:=fileToSend.Size;
FTCPClient.WriteStream(fileToSend, true, true, FFileSize);


прием:
fileToRead:=TFileStream.Create(tmpFilename, fmCreate);
AThread.Connection.OpenWriteBuffer;
AThread.Connection.ReadStream(fileToRead,-1,false);
AThread.Connection.CloseWriteBuffer;


данные для отрисовки прогресса надо ловить в событии Connection.OnWork
Если ты шлешь файл в отдельном треде, то отрисовку прогресса нужно делать через Synchronize() или TIdSync или посылая данные окну, где идет отрисовка, через PostMessage.

Пример на тему отсылки/приема файлов есть в Indy\IndyDemos\ImageServer\Server



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.039 c
9-1083680150
min
2004-05-04 18:15
2004.08.29
Подскажите плз алгоритм полёта пули на OpenGl!!!


4-1088846360
Sj
2004-07-03 13:19
2004.08.29
TaskBar + System Tray в Delphi


4-1089842903
DeScriptor
2004-07-15 02:08
2004.08.29
Выбор директории


4-1090061970
Cara
2004-07-17 14:59
2004.08.29
Widestring to String


6-1088326312
Oleg
2004-06-27 12:51
2004.08.29
Порты в Windows 9x, NT, XP