2015-10-16 6 views
1

Я использую Delphi XE7. Раньше я никогда не использовал компоненты Indy.TIdCommandHandler: Как создать команды?

Я нашел очень хороший учебник от Embarcadero под названием Developing TCP/IP-based Server Applications using Indy Components. Он показывает очень хороший пример, используя TidCmdTCPServer и Command Handlers.

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

Смотрите код ниже:

procedure TMyServer.InitializeCommandHandlers; 
var 
    NewCmd: TIdCommandHandler; 
begin 
    NewCmd       := FCommandHandlers.Add; 
    NewCmd.Command     := 'HEARTBEAT'; { Do not Localize } 
    NewCmd.OnCommand     := CommandHEARTBEAT; 
    NewCmd.ExceptionReply.NumericCode := 550; 
    NewCmd.Description.Text   := 'Syntax: HEARTBEAT'; { do not localize } 
    NewCmd.Disconnect     := False; 

    NewCmd       := FCommandHandlers.Add; 
    NewCmd.Command     := 'COLOR'; { Do not Localize } 
    NewCmd.CmdDelimiter    := #$20; 
    NewCmd.ParamDelimiter    := '|'; 
    NewCmd.OnCommand     := CommandCOLOR; 
    NewCmd.ExceptionReply.NumericCode := 550; 
    NewCmd.Description.Text   := 'Syntax: COLOR <sp> "GET | [SET" | color-"blue | red | yellow]"'; { do not localize } 
    NewCmd.Disconnect     := False; 
end; 

Первая команда HEARTBEAT, довольно легко, но команда COLOR нет.

я не понял строку:

NewCmd.Description.Text   := 'Syntax: COLOR <sp> "GET | [SET" | color-"blue | red | yellow]"'; { do not localize } 

Может кто-нибудь объяснить, как он построен? Или показать мне документ, где я могу это узнать?

Что означает «не локализовать»?

ответ

3

Синтаксис должен были написаны с использованием дополненной Backus-Наура (BNF), аналогичный тому, что определено в RFC 822, Section 2 - NOTATIONAL CONVENTIONS.

COLOR - это имя команды, очевидно.

<sp> - знак пробела.

Цитаты означают буквальные строки, которые появляются как есть.

В этом случае | используется как разделитель между параметрами в передаваемых данных и как таковой должен был быть в кавычках.

[] в этом случае используется для группировки логических элементов вместе. Тем не менее, скобки появляются внутри кавычек, что неверно, потому что они фактически не отображаются в передаче.

color- этот случай на самом деле не передается и не должен быть также в синтаксисе.

Таким образом, на основе фактического кода, предусмотренного в статье, сервер будет принимать следующие команды (чувствительно к регистру):

HEARTBEAT 
COLOR GET 
COLOR SET|BLUE 
COLOR SET|RED 
COLOR SET|YELLOW 

Что вы можете ясно видеть в коде клиента статьи:

IdTCPClient1.Socket.WriteLn('HEARTBEAT'); 

IdTCPClient1.IOHandler.WriteLn('COLOR GET'); 

case RadioGroup1.ItemIndex of 
    0: IdTCPClient1.IOHandler.WriteLn('COLOR SET|BLUE'); 
    1: IdTCPClient1.IOHandler.WriteLn('COLOR SET|RED'); 
    2: IdTCPClient1.IOHandler.WriteLn('COLOR SET|YELLOW'); 
end; 

Синтаксис правильно Таким образом, следует определить следующим образом:

NewCmd.Description.Text := 'Syntax: COLOR <sp> ("GET"/("SET" "|" ("BLUE"/"RED"/"YELLOW")))'; { do not localize } 

{ do not localize } намек на автоматизированные средства интернационализации и переводчиков, что строка содержит строковые литералы, которые должны быть оставлены как есть и не локализованные на каком-либо конкретном языке.

Это, как говорится, в статье также упоминает об этом:

Поскольку мы решили использовать TidCmdTCPServer мы не можем просто положить один на форме. Вместо этого мы должны спуститься с нашей собственной базой классов на TidCmdTCPServer и добавить к ней все наше привычное поведение. Это был даже предпочтительный путь, даже если TidTCPServer поддерживает обработчики команд.

Это просто неправда. Коллекция TIdCmdTCPServer.CommandHandlers (TIdTCPServer.CommandHandlers в Indy 9) доступна во время разработки и полностью редактируется с помощью Object Inspector и его встроенного редактора коллекций, включая назначение обработчиков событий для каждой команды. Это предпочтительный способ использования и всегда был. Единственной причиной получения пользовательского компонента является необходимость модульного кода обработки команд, чтобы сделать его многоразовым (Indy имеет несколько собственных производных компонентов TIdCmdTCPServer). В противном случае получение и установка нового компонента будет чрезмерным.

+0

+1000! Отличный ответ !!!! Большое спасибо. –