Главная страница
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.025 c
1-1092503692
Gnec
2004-08-14 21:14
2004.08.29
Как заставить эдит понимать числа


1-1092136580
Ikonka
2004-08-10 15:16
2004.08.29
Bug tracking system


14-1092077360
gn
2004-08-09 22:49
2004.08.29
500 ДОЛЛАРОВ США ЗА ОБНАРУЖЕНИЕ ДЫРЫ В БРАУЗЕРЕ MOZILLA


1-1092150879
3APA3A
2004-08-10 19:14
2004.08.29
Переключение на другую страницу в TPageControle


6-1088540567
S-Viper
2004-06-30 00:22
2004.08.29
локальные сети, IP...