Конференция "Сети" » Передача файлов от клиента серверу Indy [D7]
 
  • Айгуль (12.08.15 08:03) [0]
    Здравствуйте!
    Возникла проблема с клиент-серверным приложением (использую 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 - в одной что передать, во второй куда передать.
  • Pavia © (12.08.15 11:03) [1]
    Составе перечень отказов. Потом сделайте модель работы вашего приложения.
    Затем разработайте меры противодействия отказам.
    Короче говоря обычная задача инженера.


    > Передаю в цикле, для каждого файла у меня происходит подключение,
    >  а после передачи отключение клиента.

    Добавить в этот список:
    Разбиения файла на части.
    Проверку целостности доставки части.
    В случае сбоя пере запрос нужной части.


    > Клиент кидает все подряд, а сервер не успевает реагировать!

    Что написали, то и получили. У вас ReadStream синхронная функция.
    Она блокирует поток сервера. По исчерпанию бассейна потоков блокируется сервер IdTCPServer. Далее происходит тайм аут на все входящие соединения.
  • Айгуль (12.08.15 11:42) [2]

    > Что написали, то и получили. У вас ReadStream синхронная
    > функция.
    > Она блокирует поток сервера. По исчерпанию бассейна потоков
    > блокируется сервер IdTCPServer. Далее происходит тайм аут
    > на все входящие соединения.
    >

    Я новичок во всем этом.
    Не подскажите, как сделать чтоб клиент подождал, пока сервер все сделает и только потом отправил следующий файл?
  • Pavia © (12.08.15 12:23) [3]

    > Я новичок во всем этом. Не подскажите, как сделать чтоб
    > клиент подождал, пока сервер все сделает и только потом
    > отправил следующий файл?

    У вас всё так и написано.
  • Dennis I. Komarov © (30.08.15 09:51) [4]
    FTP
 
Конференция "Сети" » Передача файлов от клиента серверу Indy [D7]
Есть новые Нет новых   [118381   +20][b:0][p:0.001]