INDY命令处理程序.带参数的成功响应

Maw*_*awg 1 delphi indy10

我按照演示,事情正常.我的客户端有一个功能,可以将命令发送到服务器并处理响应.

对于前几个命令来说这很好,我处理它

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

  if Result <> 'OK' then ....
Run Code Online (Sandbox Code Playgroud)

服务器发送的位置

ASender.Reply.SetReply(200, 'OK');  ... or ...
ASender.Reply.SetReply(400, 'NAK');    
Run Code Online (Sandbox Code Playgroud)

现在,我想添加一个新命令,结果将是NAK或ACK PLUS值0,1或2

我对响应代码感到朦胧,这些代码似乎有两个参数,一个是数字的,一个是文本的....

可以只是kludge并发送'Ok0','OK1'或'OK2',但这非常难看(可能是一件坏事)

我想我虽然使用200成功并在文本参数中发送0,1或2(或使用'OK'并发送0,1或2作为数字代码,或使用200,201,202作为数字代码)?

有人可以帮我理解我应该编码的内容以及为什么?(或者只是指着我的URL)谢谢

Rem*_*eau 8

SendCmd()为您读取服务器的响应,所以除非服务器实际发送两个单独的响应GetResponse(),SendCmd()否则请不要调用.

回复通常采取以下形式:

<Response Code> <Optional Text>
Run Code Online (Sandbox Code Playgroud)

响应代码是数字或文本关键字的位置.

如果服务器发送数字响应代码,请按如下方式处理:

服务器:

// sends:
//
//  200 1
//
ASender.Reply.SetReply(200, '1');
Run Code Online (Sandbox Code Playgroud)

客户:

if TCPclient.SendCmd(theMessage) = 200 then
  Value := StrToInt(TCPclient.LastCmdResult.Text.Text);
Run Code Online (Sandbox Code Playgroud)

要么:

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

如果服务器发送文本响应代码,请按如下方式处理:

服务器:

// sends:
//
//  OK 1
//
ASender.Reply.SetReply('OK', '1');
Run Code Online (Sandbox Code Playgroud)

客户:

if TCPclient.SendCmd(theMessage, '') = 'OK' then
  Value := StrToInt(TCPclient.LastCmdResult.Text.Text);
Run Code Online (Sandbox Code Playgroud)

要么:

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

可以在TCPclient.LastCmdResult.Text属性中访问响应的可选文本(如果存在),因为可以TStrings在以下格式中发送多行响应:

<Response Code>-<Optional Text>
<Response Code>-<Optional Text>
...
<Response Code> <Optional Text>
Run Code Online (Sandbox Code Playgroud)

服务器:

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

客户:

TCPclient.SendCmd(theMessage, 200);
Value := StrToInt(TCPclient.LastCmdResult.Text[1]);
Run Code Online (Sandbox Code Playgroud)

您还可以在此表单中的回复后发送辅助多行文本:

<Response Code> <Optional Text>
<Secondary Text>
.
Run Code Online (Sandbox Code Playgroud)

服务器:

// 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?');
Run Code Online (Sandbox Code Playgroud)

客户:

TCPclient.SendCmd(theMessage, 200);
TCPclient.IOHandler.Capture(SomeTStringsObj);
Run Code Online (Sandbox Code Playgroud)