Форум: "Сети";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Вниз
Обмен файлами Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.046 c