Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2015, 07:03   #1
Aigulka
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию Передача файлов в цикле от клиента серверу Indy

Доброе утро!
Возникла проблема с клиент-серверным приложением (использую Indy - IdTCPServer и IdTCPClient).
Нужно передать n-ое количество файлов от клиента серверу. Вроде все работает, но когда передаются большие файлы начинаются проблемы - некоторые файлы теряются.
Передаю в цикле, для каждого файла у меня происходит подключение, а после передачи отключение клиента.
Прошу не ругать меня, т.к. я новичок
Код:
Сервер
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  IdTCPServer1.DefaultPort:=19191;
  IdTCPServer1.Active:=true;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var F: TFileStream;
begin
  memo1.Lines.Add(AThread.Connection.ReadLn);                                            // путь, куда скачать файл
  F:= TFileStream.Create(memo1.Lines.Strings[memo1.Lines.Count-1],fmCreate);  // создается файл
  AThread.Connection.ReadStream(F,-1,true);                                                 // поток передаваемый клиентом
  F.Free;
  AThread.Connection.Disconnect;
  memo1.Clear;
end;
Клиент
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  IdTCPClient.Port:=19191;
  IdTCPClient.Host:='127.0.0.1';   // пока сделала на локальном
end;

procedure TForm1.Button1Click(Sender: TObject);
var F: TFileStream;
     i: integer;
begin
  for i:=0 to memo1.Lines.Count-1 do
  begin
      IdTCPClient.Connect;
      IdTCPClient.WriteLn(memo2.Lines.Strings[i]);                        // путь в архиве
      F:= TFileStream.Create(memo1.Lines.Strings[i],fmOpenRead);  // что передать (файл клиента)
      IdTCPClient.OpenWriteBuffer;
      IdTCPClient.WriteStream(F);
      IdTCPClient.CloseWriteBuffer;
      F.Free;
      IdTCPClient.Disconnect;
  end;
end;
В клиентской части есть 2 memo - в одной что передать, во второй куда передать.
Буду рада любой помощи!!!

Последний раз редактировалось Аватар; 08.08.2015 в 08:08.
Aigulka вне форума Ответить с цитированием
Старый 08.08.2015, 08:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну все вроде логично у тебя, я бы посоветовал тебе прикрутить IdFTP и файлы ганять с его помошью. Всетки он более предназначен для такого.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 09:38   #3
Aigulka
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну все вроде логично у тебя, я бы посоветовал тебе прикрутить IdFTP и файлы ганять с его помошью. Всетки он более предназначен для такого.
Спасибо, попробую
Aigulka вне форума Ответить с цитированием
Старый 13.08.2015, 12:43   #4
Aigulka
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну все вроде логично у тебя, я бы посоветовал тебе прикрутить IdFTP и файлы ганять с его помошью. Всетки он более предназначен для такого.
Посоветуйте, как сделать, чтобы клиент после передачи файла подождал, пока сервер все сделает, а затем слал следующий файл?
А то у меня получается, что клиент кидает и не ждет ответа.
Aigulka вне форума Ответить с цитированием
Старый 13.08.2015, 14:00   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Покажи свой код.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2015, 07:36   #6
Aigulka
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Покажи свой код.
Код тот же самый, что и в начале темы
Aigulka вне форума Ответить с цитированием
Старый 14.08.2015, 08:49   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так ты меня не послушался, и не прикрутил idFTP?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2015, 09:30   #8
Aigulka
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так ты меня не послушался, и не прикрутил idFTP?
Не послушалась, вернее не получилось)) А отладить работу TCP-сервера и клиента нельзя?
Aigulka вне форума Ответить с цитированием
Старый 14.08.2015, 10:58   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я так сразу не скажу... Я как-то именно с этим компонентом избегаю работать.
Я сразу затачивался на idFTP для файлов и idHTTP для обычного обмена информацией. Плюс голые сокеты. А вот именно с IdTCPClient...
ИМХО нужно после каждой передачи делать разрыв соединения и переподключаться для следующей передачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2015, 13:30   #10
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от Aigulka Посмотреть сообщение
Сервер
Код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var F: TFileStream;
begin
  memo1.Lines.Add(AThread.Connection.ReadLn);                                            // путь, куда скачать файл
  F:= TFileStream.Create(memo1.Lines.Strings[memo1.Lines.Count-1],fmCreate);  // создается файл
  AThread.Connection.ReadStream(F,-1,true);                                                 // поток передаваемый клиентом
  F.Free;
  AThread.Connection.Disconnect;
  memo1.Clear;
end;
нельзя к мемо из потока... убери
в сервере особо критично try/finally

Код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var s:string;
F: TFileStream;
begin
  s:=AThread.Connection.ReadLn;                                            // путь, куда скачать файл
  //проверка s на атаку выхода из корня типа \..\..\..\autorun.inf и прочие проверки.
//s:='..\..\..\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\virus.exe'; - без проверки грохнуть сервер плевое дело
  F:= TFileStream.Create(memo1.Lines.Strings[memo1.Lines.Count-1],fmCreate);  // создается файл
  try
    AThread.Connection.ReadStream(F,-1,true);                                                 // поток передаваемый клиентом
  finally
    F.Free;
  end;
  AThread.Connection.Disconnect;
end;
Цитата:
Сообщение от Aigulka Посмотреть сообщение
Клиент
Код:
procedure TForm1.Button1Click(Sender: TObject);
var F: TFileStream;
     i: integer;
begin
  for i:=0 to memo1.Lines.Count-1 do
  begin
      IdTCPClient.Connect;
      IdTCPClient.WriteLn(memo2.Lines.Strings[i]);                        // путь в архиве
      F:= TFileStream.Create(memo1.Lines.Strings[i],fmOpenRead);  // что передать (файл клиента)
      IdTCPClient.OpenWriteBuffer;
      IdTCPClient.WriteStream(F);
      IdTCPClient.CloseWriteBuffer;
      F.Free;
      IdTCPClient.Disconnect;
  end;
end;
В клиентской части есть 2 memo - в одной что передать, во второй куда передать.
Буду рада любой помощи!!!
а вот тут кажется потеря и происходит... OpenWriteBuffer лишний... OpenWriteBuffer для склейки мелких запросов, а для крупных - переполняет буфер

Код:
procedure TForm1.Button1Click(Sender: TObject);
var F: TFileStream;
     i: integer;
begin
  for i:=0 to memo1.Lines.Count-1 do
  begin
      IdTCPClient.Connect;
      IdTCPClient.WriteLn(memo2.Lines.Strings[i]);                        // путь в архиве
      F:= TFileStream.Create(memo1.Lines.Strings[i],fmOpenRead);  // что передать (файл клиента)
      try
        IdTCPClient.WriteStream(F);
      finally
        F.Free;
      end;
      IdTCPClient.Disconnect;
  end;
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 14.08.2015 в 13:34.
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача данных между StringGrid'ами от клиента к серверу GrabbeR Работа с сетью в Delphi 6 18.07.2014 15:48
Передача файла от Клиента к Серверу aank10 C++ Builder 2 05.10.2012 18:02
Передача Print Screen'а от клиента к серверу (через сокеты) valdys Работа с сетью в Delphi 5 25.08.2011 12:46
Передача файла от клиента к серверу TFileStream rombler69 Работа с сетью в Delphi 1 30.03.2010 17:45
как серверу INDY распознать клиента мандарин Работа с сетью в Delphi 2 24.10.2007 13:31