нужна помощь с базовым использованием TIdCmdTCPServer - PullRequest
3 голосов
/ 07 сентября 2011

Я работаю над приложением для проверки концепции, использующим TIdCmdTCPServer в Delphi XE.

Кажется, что-то не так с моим кодом, потому что работает только первая команда.Если я повторяю ту же команду, это «время ожидания».См. Листинг кода клиента ниже.

вот мой обработчик команд:

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;

и клиентский компонент (здесь ничего особенного; я установил host & port #):

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

Есть идеи, почему это происходит?

Спасибо!Т. пл

1 Ответ

4 голосов
/ 07 сентября 2011

Вы не можете использовать TIdCmdTCPClient с TIdCmdTCPServer.TIdCmdTCPClient запускает внутренний поток, который непрерывно считывает данные из соединения, но метод SendCmd() также выполняет собственные операции чтения, поэтому они взаимодействуют друг с другом и получают данные друг друга.Вот почему вы получаете ошибки тайм-аута.Вам необходимо изменить код клиента, чтобы использовать TIdTCPClient вместо TIdCmdTCPClient.

...