【问题标题】:need help with basic use of TIdCmdTCPServer在 TIdCmdTCPServer 的基本使用方面需要帮助
【发布时间】:2011-09-07 01:45:06
【问题描述】:

我正在开发一个在 delphi XE 中使用 TIdCmdTCPServer 的概念验证应用程序。

我的代码似乎有问题,因为只有第一个命令有效。如果我重复相同的命令,它会“超时”。请参阅下面的客户端代码列表。

这是我的命令处理程序:

procedure TForm1.IdCmdTCPServer1CommandHandlersGetDateTimeCommand(ASender: TIdCommand);
begin
  ASender.Reply.SetReply(200, 'OK!');
  ASender.Reply.Text.Add(DateTimeToStr(Now));
  ASender.SendReply;  // I expect this must be redundant
end;

这是服务器组件(这里没什么特别的;我设置了端口号并创建了一个命令处理程序):

object IdCmdTCPServer1: TIdCmdTCPServer
  Bindings = <>
  DefaultPort = 7000
  CommandHandlers = <
    item
      CmdDelimiter = ' '
      Command = 'GetDateTime'
      Disconnect = False
      Name = 'TIdCommandHandler0'
      NormalReply.Code = '200'
      ParamDelimiter = ' '
      ParseParams = True
      Tag = 0
      OnCommand = IdCmdTCPServer1CommandHandlersGetDateTimeCommand
    end
  ExceptionReply.Code = '500'
  ExceptionReply.Text.Strings = (
    'Unknown Internal Error')
  Greeting.Code = '200'
  Greeting.Text.Strings = (
    'Welcome')
  HelpReply.Code = '100'
  HelpReply.Text.Strings = (
    'Help follows')
  MaxConnectionReply.Code = '300'
  MaxConnectionReply.Text.Strings = (
    'Too many connections. Try again later.')
  ReplyTexts = <>
  ReplyUnknownCommand.Code = '400'
  ReplyUnknownCommand.Text.Strings = (
    'Unknown Command')
  Left = 64
  Top = 8
end

这是出现问题的客户端代码:

  Client.Connect;
  try
    // retrieve welcome text
    memo1.lines.AddStrings(Client.LastCmdResult.Text);

    Client.SendCmd('GetDateTime', 200);
    memo1.lines.AddStrings(Client.LastCmdResult.Text);

    //////////////////////////// FAILS HERE (timeout)
    Client.SendCmd('GetDateTime', 200);
    memo1.lines.AddStrings(Client.LastCmdResult.Text);
  finally
    Client.Disconnect(true);
  end;

和客户端组件(这里没什么特别的;我设置了主机和端口号):

object Client: TIdCmdTCPClient
  ConnectTimeout = 1000
  Host = '127.0.0.1'
  IPVersion = Id_IPv4
  Port = 7000
  ReadTimeout = 1000
  CommandHandlers = <>
  ExceptionReply.Code = '500'
  ExceptionReply.Text.Strings = (
    'Unknown Internal Error')
  Left = 144
  Top = 96
end

任何想法为什么会发生这种情况?

谢谢! mp

【问题讨论】:

    标签: delphi indy


    【解决方案1】:

    您不能将TIdCmdTCPClientTIdCmdTCPServer 一起使用。 TIdCmdTCPClient 运行一个内部线程不断从连接中读取,但是SendCmd() 方法也执行了自己的读取操作,所以两者互相干扰,互相抢对方的数据。这就是您收到超时错误的原因。您需要更改您的客户端代码以使用TIdTCPClient 而不是TIdCmdTCPClient

    【讨论】:

    • 谢谢雷米!你之前对别人说这句话的时候我还没明白你的意思。
    • >"您不能将 TIdCmdTCPClient 与 TIdCmdTCPServer 一起使用"。真的吗?那么 TIdCmdTCPClient 的目的是什么?为什么客户端组件会自动读取一些东西?这种行为通常与服务器端无关吗?我想尝试这两个组件,因为我需要一个发送简单命令的小型客户端-服务器应用程序,但我不想实现自己的协议。甚至 TIdTCPServer 的文档也说要使用 Cmd 组件,因为仅 tcp 组件不提供应用程序级别的协议。
    • 名称中的Cmd 指的是CommandHandlers 集合,TIdCmdTCPClientTIdCmdTCPServer 都有。 TIdCmdTCPClient 用于客户端套接字连接到服务器套接字的协议,然后客户端从服务器接收未经请求的/异步数据包,这些数据包由客户端的CommandHandlers 处理。数据包可能是也可能不是对命令的响应,但它们不遵循大多数协议使用的传统客户端命令/服务器响应模型。 TIdIRC 就是一个例子……
    • ... 另一个例子是传统的命令/响应模型,其中各方角色互换 - 服务器套接字发送客户端套接字响应的命令。这在实现 NAT 遍历技术的应用程序中可能很有用,其中角色可能必须交换才能在各方之间建立 TCP 连接,而一方在 NAT 后面,而另一方不在。请记住,TCP 是双向的。哪一方发起与另一方的 TCP 连接很重要,但一旦建立,哪一方向另一方发送数据以及以何种顺序发送数据都无关紧要。
    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2014-02-06
    • 2017-11-02
    相关资源
    最近更新 更多