2016-04-14 1 views
0

Я хотел бы создать Inter Machine Communication, используя компоненты INDY TCP Client и Server. IdTCPServer имеет событие OnExecute, которое запускается, когда клиент хочет что-то с сервера. Я хотел бы создать ту же функциональность, когда SERVER отправит запрос клиенту, который будет иметь одно и то же событие OnExecute, точно так же, как он работал как сервер. Легко ли это достичь? Мне нужно это, потому что я могу подключиться к одноранговому узлу только в одну сторону (NAT)Как отменить инициатор соединения в IdTCPClient и IdTCPServer с одинаковой функциональностью?

ответ

1

IdTCPServer имеет событие OnExecute, которое запускается, когда клиент хочет что-то с сервера.

Это не так, как работает TIdTCPServer.OnExecute. Он вызывается в непрерывном цикле для времени жизни соединения, независимо от того, что клиент или сервер делает с соединением между моментом, когда он подключен, и временем, когда он отключен.

типовое использование события должно блокировать вызывающий поток, ожидающий, когда клиент отправит пакет, затем ответит пакетом, а затем выйдет, позволяя циклу снова запустить событие, чтобы он мог дождаться следующий клиентский пакет.

Но это не только способ использования мероприятия.

Я хотел был бы создать такую ​​же функциональность, когда SERVER отправит запрос КЛИЕНТУ, который будет иметь такое же событие OnExecute, как и он работал как сервер. Легко ли это достичь?

TIdTCPClient не реализует эту логику изначально. Он просто обеспечивает соединение, но вам нужно написать свой собственный код, чтобы рассказать ему, когда читать и записывать данные по этому соединению.

За то, что вы просите, вам нужно будет создать свой собственный рабочий поток, либо путем написания -derived класса TThread/TIdThread, или с помощью TIdThreadComponent компонента. Когда клиент подключается к серверу, запустите поток. Когда клиент отключается, остановите поток. Затем ваш поток может делать все, что угодно, с подключением, как и с событием TIdTCPServer.OnExecute.

В зависимости от формата ваших команд/ответов, вы может быть в состоянии использовать TIdCmdTCPClient вместо TIdTCPClient. TIdCmdTCPClient выполняет собственный поток внутри, а его коллекция CommandHandlers анализирует входящие запросы и генерирует исходящие ответы. Все, что вам нужно сделать, это заполнить коллекцию объектами TIdCommandHandler, которые определяют критерии анализа для каждого запроса и назначают обработчик событий OnCommand каждому, чтобы реагировать на каждый запрос, отправляемый сервером.