Здравствуйте, подскажите что у меня идеалогически не правильно в этом коде.
По одной команде шлю и получаю ответ без проблем. А вот если я хочу (точнее так нужно по заданию) отослать N команд и получить корректно на все ответы. Как корректно слать одну за одной команды, дожидаясь пока не отработает полностью предыдущая. Посылая несколько команд, теряю соединение, но иногда и проскакивает, менять CheckForDataOnSource(100); - не помогает. На сегодня имею примерно такой код:
...................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;
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
04-11-2018 10:08
Самая первая и основная ошибка - использование "индейцев". С чего это Вы так лихо организовали цикл отправки? Кто Вам сказал, что ответ придет так быстро (я так понимаю за 100 мсек), что на этом строите алгоритм? Это Ваш ресурс? Он находится в Вашем датацентре? Откуда такая уверенность? Насколько я понимаю, должен быть определен четкий критерий того, что "ОТВЕТА БОЛЬШЕ НЕ СТОИТ ЖДАТЬ, ЕСЛИ *************************. ПОЭТОМУ нужно повторить (забить и слать следующую) команду. В Вашем цикле нет ничего подобного.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.