-
Здравствуйте! Возникла проблема с клиент-серверным приложением (использую 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 - в одной что передать, во второй куда передать.
-
Составе перечень отказов. Потом сделайте модель работы вашего приложения. Затем разработайте меры противодействия отказам. Короче говоря обычная задача инженера.
> Передаю в цикле, для каждого файла у меня происходит подключение, > а после передачи отключение клиента.
Добавить в этот список: Разбиения файла на части. Проверку целостности доставки части. В случае сбоя пере запрос нужной части.
> Клиент кидает все подряд, а сервер не успевает реагировать!
Что написали, то и получили. У вас ReadStream синхронная функция. Она блокирует поток сервера. По исчерпанию бассейна потоков блокируется сервер IdTCPServer. Далее происходит тайм аут на все входящие соединения.
-
> Что написали, то и получили. У вас ReadStream синхронная > функция. > Она блокирует поток сервера. По исчерпанию бассейна потоков > блокируется сервер IdTCPServer. Далее происходит тайм аут > на все входящие соединения. >
Я новичок во всем этом. Не подскажите, как сделать чтоб клиент подождал, пока сервер все сделает и только потом отправил следующий файл?
-
> Я новичок во всем этом. Не подскажите, как сделать чтоб > клиент подождал, пока сервер все сделает и только потом > отправил следующий файл?
У вас всё так и написано.
-
FTP
|