Обработчик команды INDY. Успешный ответ с параметром

Я следил за демонстрацией, и все работает нормально. У моего клиента есть единственная функция для отправки команд на сервер и обработки ответа.

Это было нормально для первых нескольких команд, и я справляюсь с этим

  var result : String;
  TCPclient.SendCmd(theMessage);
  TCPclient.GetResponse(Result);

  if Result <> 'OK' then ....

Куда сервер отправляет

ASender.Reply.SetReply(200, 'OK');  ... or ...
ASender.Reply.SetReply(400, 'NAK');    

Теперь я хочу добавить новую команду, и результатом будет либо NAK, либо ACK PLUS со значением 0, 1 или 2.

Я смутно понимаю коды ответов, которые, кажется, имеют два параметра: один числовой и один текстовый....

Я мог бы просто запутаться и отправить «ОК0», «ОК1» или «ОК2», но это очень некрасиво (и, вероятно, Плохо)

Я думаю, что использовать 200 для успеха и отправить 0, 1 или 2 в текстовом параметре (или использовать «ОК» и отправить 0, 1 или 2 в виде числового кода, или использовать 200, 201, 202 в качестве числового кода)?

Может кто-нибудь, пожалуйста, помогите мне понять, что я должен кодировать и почему? (Или просто укажите мне URL) Спасибо


person Mawg says reinstate Monica    schedule 27.04.2012    source источник


Ответы (1)


SendCmd() читает для вас ответ сервера, поэтому НЕ вызывайте GetResponse() после SendCmd(), если только сервер не отправляет два отдельных ответа.

Ответы обычно имеют форму:

<Response Code> <Optional Text>

Где код ответа является либо числом, либо текстовым ключевым словом.

Если сервер отправляет числовые коды ответа, обработайте это следующим образом:

Сервер:

// sends:
//
//  200 1
//
ASender.Reply.SetReply(200, '1');

Клиент:

if TCPclient.SendCmd(theMessage) = 200 then
  Value := StrToInt(TCPclient.LastCmdResult.Text.Text);

Or:

// raises an exception if a non-200 response is received
TCPclient.SendCmd(theMessage, 200);
Value := StrToInt(TCPclient.LastCmdResult.Text.Text);

Если сервер отправляет текстовые коды ответов, обработайте это следующим образом:

Сервер:

// sends:
//
//  OK 1
//
ASender.Reply.SetReply('OK', '1');

Клиент:

if TCPclient.SendCmd(theMessage, '') = 'OK' then
  Value := StrToInt(TCPclient.LastCmdResult.Text.Text);

Or:

// raises an exception if a non-OK response is received
TCPclient.SendCmd(theMessage, ['OK']);
Value := StrToInt(TCPclient.LastCmdResult.Text.Text);

Необязательный текст ответа, если он присутствует, может быть доступен в свойстве TCPclient.LastCmdResult.Text, которое является TStrings, так как можно отправлять многострочные ответы в форме:

<Response Code>-<Optional Text>
<Response Code>-<Optional Text>
...
<Response Code> <Optional Text>

Сервер:

// sends:
//
//  200-The value is
//  200 1
//
ASender.Reply.SetReply(200, 'The value is');
ASender.Reply.Text.Add('1');

Клиент:

TCPclient.SendCmd(theMessage, 200);
Value := StrToInt(TCPclient.LastCmdResult.Text[1]);

Вы также можете отправить вторичный многострочный текст после ответов в этой форме:

<Response Code> <Optional Text>
<Secondary Text>
.

Сервер:

// sends:
//
//  200 Data follows
//  Hello world
//  How are you?
//  .
//
ASender.Reply.SetReply(200, 'Data follows');
ASender.Reply.Response.Add('Hello world');
ASender.Reply.Response.Add('How are you?');

Клиент:

TCPclient.SendCmd(theMessage, 200);
TCPclient.IOHandler.Capture(SomeTStringsObj);
person Remy Lebeau    schedule 27.04.2012
comment
+1 и ответ. Реми, большое спасибо, что нашли время дать такой подробный ответ. Я надеюсь, что это поможет другим. - person Mawg says reinstate Monica; 27.04.2012