Я хотел бы создать Inter Machine Communication, используя компоненты INDY TCP Client и Server. IdTCPServer имеет событие OnExecute, которое запускается, когда клиент хочет что-то с сервера. Я хотел бы создать ту же функциональность, когда SERVER отправит запрос клиенту, который будет иметь одно и то же событие OnExecute, точно так же, как он работал как сервер. Легко ли это достичь? Мне нужно это, потому что я могу подключиться к одноранговому узлу только в одну сторону (NAT)Как отменить инициатор соединения в IdTCPClient и IdTCPServer с одинаковой функциональностью?
ответ
IdTCPServer имеет событие OnExecute, которое запускается, когда клиент хочет что-то с сервера.
Это не так, как работает TIdTCPServer.OnExecute
. Он вызывается в непрерывном цикле для времени жизни соединения, независимо от того, что клиент или сервер делает с соединением между моментом, когда он подключен, и временем, когда он отключен.
типовое использование события должно блокировать вызывающий поток, ожидающий, когда клиент отправит пакет, затем ответит пакетом, а затем выйдет, позволяя циклу снова запустить событие, чтобы он мог дождаться следующий клиентский пакет.
Но это не только способ использования мероприятия.
Я хотел был бы создать такую же функциональность, когда SERVER отправит запрос КЛИЕНТУ, который будет иметь такое же событие OnExecute, как и он работал как сервер. Легко ли это достичь?
TIdTCPClient
не реализует эту логику изначально. Он просто обеспечивает соединение, но вам нужно написать свой собственный код, чтобы рассказать ему, когда читать и записывать данные по этому соединению.
За то, что вы просите, вам нужно будет создать свой собственный рабочий поток, либо путем написания -derived класса TThread
/TIdThread
, или с помощью TIdThreadComponent
компонента. Когда клиент подключается к серверу, запустите поток. Когда клиент отключается, остановите поток. Затем ваш поток может делать все, что угодно, с подключением, как и с событием TIdTCPServer.OnExecute
.
В зависимости от формата ваших команд/ответов, вы может быть в состоянии использовать TIdCmdTCPClient
вместо TIdTCPClient
. TIdCmdTCPClient
выполняет собственный поток внутри, а его коллекция CommandHandlers
анализирует входящие запросы и генерирует исходящие ответы. Все, что вам нужно сделать, это заполнить коллекцию объектами TIdCommandHandler
, которые определяют критерии анализа для каждого запроса и назначают обработчик событий OnCommand
каждому, чтобы реагировать на каждый запрос, отправляемый сервером.