Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача файла TidTCPServerClient/TidTCPClient  (Прочитано 5122 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shouldercannon
Постоялец

ru
Offline Offline

« : 21-01-2016 14:08 » 

Доброго времени суток!
Нашёл пример передачи файлов, но в нём клиент передаёт файл серверу
Код: (Delphi)
...
var
  Form1: TForm1;
  FName: String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Запуск сервера
  IdTCPServer1.DefaultPort := Port;
  IdTCPServer1.Active := True;
  // Запуск клиента
  IdTCPClient1.Host := Host;
  IdTCPClient1.Port := Port;

  LServerStatus.Caption := 'Ожидание подключения...';
end;
//------------------------------------Server------------------------------------
procedure TForm1.BSelectFileClick(Sender: TObject);
begin
  if OpenDialog1.Execute then FName := OpenDialog1.FileName;
end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  LServerStatus.Caption := 'Передача...';
end;

procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
begin
  LServerStatus.Caption := 'Отмена передачи';
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  FS: TFileStream;
  FName: String;
begin
  FName := AContext.Connection.IOHandler.ReadLn;

  FS := TFileStream.Create('Downloads\' + ExtractFileName(FName), fmCreate); // Сохранение
  try
    AContext.Connection.IOHandler.ReadStream(FS, -1, True); // Поток передаваемый клиентом
  finally
    FreeAndNil(FS);;
  end;

  AContext.Connection.Disconnect;

  LServerStatus.Caption := 'Файл принят';
end;
//------------------------------------Client------------------------------------
procedure TForm1.BFileReceiveClick(Sender: TObject);
var
  FS: TFileStream;
begin
  IdTCPClient1.Connect;
  IdTCPClient1.IOHandler.WriteLn(FName);

  FS := TFileStream.Create(FName, fmOpenRead or fmShareDenyNone); // Загрузка
  try
    IdTCPClient1.IOHandler.Write(FS); // Поток принимаемый сервером
  finally
    FreeAndNil(FS);
  end;

  IdTCPClient1.Disconnect;

  LClientStatus.Caption := 'Файл отправлен';
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  LClientStatus.Caption := 'Приём...';
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  LClientStatus.Caption := 'Отмена приёма';
end;
Хотел сделать наоборот (*.pas в прикреплённом файле) и всё убил  Улыбаюсь
Код: (Delphi)
procedure TForm1.IdTCPClient1SocketAllocated(Sender: TObject);
var
  FS: TFileStream;
  FName: String;
begin
  FName := IdTCPClient1.IOHandler.ReadLn;
дальше код не выполняется и программа повисает

* Unit1.zip (1.23 Кб - загружено 81 раз.)
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-01-2016 18:46 » 

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

ru
Offline Offline

« Ответ #2 : 21-01-2016 19:16 » 

В новом варианте сначала запускается сервер и ждёт подключения клиента. Клиент подключается и начинается передача файла от сервера к клиенту.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-01-2016 11:40 » 

Shouldercannon, а по логам что? передача с сервера начинается? Быстрее всего сбрасывать в лог до/после каждого действия, и смотреть, где застревает.
Записан
Shouldercannon
Постоялец

ru
Offline Offline

« Ответ #4 : 22-01-2016 12:31 » 

Вот что в логах

* Безымянный.png (78.4 Кб - загружено 82 раз.)
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 22-01-2016 20:30 » 

Вот что в логах
Это всё системные сообщения о старте процесса. Я про то, чтобы в отладочный лог до/после каждого действия (подключение к серверу, приём входящего соединения на сервере, старт приёма/передачи) самому, руками, записывать в лог сообщения, чтобы видеть, что уже произошло и с каким результатом.
Пока ощущение, что вы пытаетесь копипасту при помощи танцев с бубном починить, а надо получить чёткую картину, что происходит, чтобы понять, что именно и в какой момент идёт не так.
Записан
Shouldercannon
Постоялец

ru
Offline Offline

« Ответ #6 : 25-01-2016 11:11 » new

Если не ошибаюсь, то TIdTCPClient не имеет некого свойства прослушивания, например
Код: (Delphi)
ClientSocketRead
, значит из-за этого и висяк. Получается нужно в отдельном потоке делать
Код: (Delphi)
ReadLn
и получать файл
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines