Как сделать блокировку вызова Indy 10 TIdTCPClient?

У меня очень простое приложение с 10 клиентами и 2 серверами. Каждый клиент отправляет сердцебиение на оба сервера каждые 10 секунд. Кроме того, каждые несколько минут он может инициироваться внешним событием, отправлять еще одну строку на сервер TIdCmdTCPServer и ожидать ответа.

Я начинающий в сети. Для простоты я хотел бы сделать блокирующий вызов (так как система очень проста) - клиент отправляет сообщение на сервер и блокирует, ожидая ответа (или тайм-аут).

Могу ли я сделать это? Или мне нужно буферизовать мои сообщения и дождаться ответа клиента (или тайм-аута) перед отправкой следующего?

Windows 7 Pro, Indy 10, Delphi XE2

1 ответ

Решение

Indy использует исключительно блокировку ввода / вывода, поэтому то, что вы просите, выполнимо, фактически именно так и работает Indy в большинстве ситуаций. Просто выполните операцию записи и подождите, пока она не вернется, и вы можете сразу же выполнить операцию чтения. На самом деле, так как вы уже используете TIdCmdTCPServer на стороне сервера вы можете использовать TIdTCPClient.SendCmd() на стороне клиента отправить команду и дождаться ее ответа за одну операцию.

Просто отметьте, что, поскольку Indy блокирует, вы должны использовать TIdTCPClient в рабочем потоке, если вы не хотите блокировать основной поток, из-за чего пользовательский интерфейс не отвечает TIdTCPClient занят.

Другие вопросы по тегам