Как сделать блокировку вызова Indy 10 TIdTCPClient?
У меня очень простое приложение с 10 клиентами и 2 серверами. Каждый клиент отправляет сердцебиение на оба сервера каждые 10 секунд. Кроме того, каждые несколько минут он может инициироваться внешним событием, отправлять еще одну строку на сервер TIdCmdTCPServer и ожидать ответа.
Я начинающий в сети. Для простоты я хотел бы сделать блокирующий вызов (так как система очень проста) - клиент отправляет сообщение на сервер и блокирует, ожидая ответа (или тайм-аут).
Могу ли я сделать это? Или мне нужно буферизовать мои сообщения и дождаться ответа клиента (или тайм-аута) перед отправкой следующего?
Windows 7 Pro, Indy 10, Delphi XE2
1 ответ
Indy использует исключительно блокировку ввода / вывода, поэтому то, что вы просите, выполнимо, фактически именно так и работает Indy в большинстве ситуаций. Просто выполните операцию записи и подождите, пока она не вернется, и вы можете сразу же выполнить операцию чтения. На самом деле, так как вы уже используете TIdCmdTCPServer
на стороне сервера вы можете использовать TIdTCPClient.SendCmd()
на стороне клиента отправить команду и дождаться ее ответа за одну операцию.
Просто отметьте, что, поскольку Indy блокирует, вы должны использовать TIdTCPClient
в рабочем потоке, если вы не хотите блокировать основной поток, из-за чего пользовательский интерфейс не отвечает TIdTCPClient
занят.