【问题标题】:INDY command handler. Success response with a parameterINDY 命令处理程序。带参数的成功响应
【发布时间】:2012-04-27 03:02:28
【问题描述】:

我按照演示进行了操作,一切正常。我的客户端只有一个函数可以向服务器发送命令并处理响应。

前几个命令很好,我处理它

  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

我对似乎有两个参数的响应代码很模糊,一个数字和一个文本......

可以只是拼凑并发送“Ok0”、“OK1”或“OK2”,但这很丑陋(而且可能是一件坏事)

我想我认为我使用 200 表示成功并在文本参数中发送 0、1 或 2(或使用“OK”并发送 0、1 或 2 作为数字代码,或使用 200、201、202 作为数字代码)?

谁能帮我理解我应该编码什么以及为什么? (或者只是指向我的 URL)谢谢

【问题讨论】:

    标签: delphi indy10


    【解决方案1】:

    SendCmd() 为您从服务器读取响应,因此请勿在 SendCmd() 之后调用 GetResponse(),除非服务器实际上发送了两个单独的响应。

    回复通常采用以下形式:

    <Response Code> <Optional Text>
    

    其中响应​​代码是数字或文本关键字。

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

    服务器:

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

    客户:

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

    或者:

    // 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);
    

    或者:

    // 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);
    

    【讨论】:

    • +1 和答案。 Remy,非常感谢您抽出时间给出如此详细的答案。我希望它能帮助其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2014-10-06
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多