Delphi: создайте семантику кометы, используя idhttp
Я пытаюсь реализовать подписку на события по протоколу http, и я хочу сделать это в Delphi. Согласно документу, они называют его "Канал событий", ниже приведено описание:
С помощью этого метода удаленное приложение сначала устанавливает канал событий для доставки событий. Затем сервер доставляет события для этой подписки по каналу событий. Канал событий устанавливается как потоковое соединение HTTP. Это постоянное соединение создается с использованием семантики Comet.
и ниже приведены шаги для реализации их распределения событий и подписки:
Клиент открывает HTTP-соединение с Сервером, отправляя запрос на добавление канала событий. Сервер обрабатывает это и отвечает ответом chunked, то есть ответом об успешном выполнении или сообщением об ошибке с заголовком Transfer-Encoding: chunked.
Клиент обрабатывает ответ, но сохраняет соединение открытым, так как ответ разбивается на части, поддерживая семантику потоковой передачи HTTP.
Клиент выдает подписку на один или несколько пакетов событий через второе соединение HTTP(S) с сервером. Это соединение не является соединением Comet, а является стандартным соединением HTTP 1.1 запрос-ответ.
Сервер отвечает на эту Подписку, в случае успеха, с действительным идентификатором подписки.
Сервер доставляет начальные и последующие события, соответствующие подписке, как отдельные фрагменты по установленному соединению канала событий, если и когда события инициируются на Сервере.
Клиент обрабатывает эти события и отправляет ответ на событие для каждого события через второе (не кометное) HTTP(S) соединение на сервер.
Клиент периодически отправляет запрос сердцебиения, чтобы гарантировать, что нижестоящие брандмауэры или прокси-серверы не разрывают HTTP-соединение (Comet) из-за неактивности. Клиент отправляет запрос сердцебиения через второе соединение HTTP(S) к Серверу. Сервер предоставляет успешный ответ на запрос, а также отправляет сообщение пульса в виде отдельного фрагмента через установленное соединение канала событий.
Когда канал установлен, клиентское приложение должно кэшировать адрес конкретного сервера, к которому оно пришло, так как ему нужно будет установить новое HTTP-соединение с ним для отправки пульса канала. Поскольку пульс канала должен вызываться на сервере, на котором размещено потоковое соединение, отправка его на полное доменное имя может привести к его отправке на другой сервер, что приведет к аннулированию пульса.
Я заменил фактическое имя сервера api только словом "сервер".
- Есть ли способ реализовать семантику комет в Delphi с помощью idhttp?
- Как мне поддерживать открытое соединение, которое ждет или слушает сервер?
- Как прочитать или получить какие-либо сообщения или ответ от сервера на мое открытое http-соединение или как потоковое http-соединение?
Сценарий:
- Запросите почтовый запрос на сервер и оставьте соединение открытым.
- Сервер будет постоянно отправлять данные клиенту, чье соединение открыто и сделал запрос.
Спасибо всем.