Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

IdTCPServer Indy10


kashey ©   (02.11.18 14:18

Здравствуйте, подскажите что у меня идеалогически не правильно в этом коде.
По одной команде шлю и получаю ответ без проблем. А вот если я хочу (точнее так нужно по заданию) отослать N команд и получить корректно на все ответы. Как корректно слать одну за одной команды, дожидаясь пока не отработает полностью предыдущая. Посылая несколько команд, теряю соединение, но иногда и проскакивает, менять CheckForDataOnSource(100); - не помогает. На сегодня имею примерно такой код:
...................Main Unit.....................
procedure TMainForm.TraceIntoBtnClick(Sender: TObject);
begin
 MyServer.FSendList.Add('command 0');
 MyServer.FSendList.Add('command 1');
 MyServer.FSendList.Add('command 3');
end;

...................My Server Unit.................
var
 TotalStr: String;
 FSendList: TStringList;
...................................................
procedure TMyServer.ParseRecv(RecvText: string);
begin
 //к VCL компонентам не обращаюсь, иначе далею вызов этой процедуры из Execute
 //через TIdSync.Synchronize, а TotalStr в TIdSync передаю через свойсво;

 FReady := True;
end;

procedure TMyServer.Execute(AContext: TIdContext);
var
 Buffer: TIdBytes;
 Size: Integer;
 RecvStr: string;
begin
 Buffer := nil;

 with AContext.Connection.IOHandler do begin
   CheckForDataOnSource(100);
   if not InputBufferIsEmpty then begin
     Size := StrToInt(ReadLn()); //читаю длинну пришедший данный от клиента в байтах
     InputBuffer.ExtractToBytes(Buffer);
     SetString(RecvStr, PAnsiChar(@Buffer[0]), Size);
     
     //собираем ответ от клиента кусками
     TotalStr := TotalStr + RecvStr;
     //FEndResponse = '</response>'
     //если ответ заканцивается на '</response>' то считаем ответ полностью полученным
     if ((Copy(FTotalStr, Length(FTotalStr) - Length(FEndResponse), Length(FEndResponse))) = FEndResponse) then begin
       ParseRecv(TotalStr);
       TotalStr := '';
     end;                                                                                                                        
   end
   else begin // Если уз буфера все прочитанно и в списке есть еще команды, то шлем следующую
     if (FReady) and (FSendList.Count > 0) then begin
        FReady := False;
        Write(FSendList[0] + #0); //шлю команды из очереди
        FSendList.Delete(0);
     end;
   end;
 end;
end;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо