Главная страница
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.052 c
1-1092127618
ЮрийК
2004-08-10 12:46
2004.08.29
Вылет проги по "Invalid floating point operation"


3-1091561658
Alex_Bredin
2004-08-03 23:34
2004.08.29
Триггер не работает.


14-1092214027
Тень отца Гамлета
2004-08-11 12:47
2004.08.29
Посмотрел Короля Артура


4-1089758810
ElRaki
2004-07-14 02:46
2004.08.29
Имя файла, загрузившего DLL


14-1092131844
вразлет
2004-08-10 13:57
2004.08.29
Прогнозы на будующее экономическое "процветание" Украины и России