2015-06-19 5 views
0

Я использую длительный опрос HTTP для нажатия событий сервера клиенту.Поддерживает ли HTTP длительный опрос сообщение о сердцебиении?

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

На стороне сервера мы использовали фреймворк cometd (я на стороне клиента, мало что знаю о стороне сервера).

Проблема в том, что когда-то соединение прерывается, и клиент не может обнаружить это, поэтому он блокирует его навсегда. Мы пытаемся реализовать какое-то сообщение о сердцебиении, которое будет отправлено каждые N минут, чтобы поддерживать соединение. Но это, похоже, не работает.

Мой вопрос: действительно ли длительный опрос HTTP поддерживает сообщения о сердцебиении? Насколько я понимаю, длительный опрос HTTP позволяет серверу отправлять одно событие и сразу же закрыть соединение. Клиент должен повторно подключиться и отправить новый запрос, чтобы получить следующее событие. Возможно ли, что сервер отправляет сообщения о сердцебиении каждые N минут, пока все еще держит соединение открытым до тех пор, пока не произойдет реальное событие сервера?

ответ

0

Если вы используете инфраструктуру CometD, то она заботится об уведомлении приложения (как на клиенте, так и на сервере) о том, когда соединение нарушено, и оно отправляет сообщения с биением.

То, что вы называете «длительным опросом HTTP», является обычным HTTP-запросом, поэтому сам по себе не поддерживает сообщения о сердцебиении. Вы можете использовать HTTP длинные запросы на опрос, чтобы выполнять сообщения с биением, и это то, что CometD делает для вас под обложками.

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

CometD предлагает вашему приложению API более высокого уровня, который не зависит от транспорта, поэтому вы можете использовать WebSocket, а не HTTP, что является более эффективным, не меняя ни одной строки в вашем приложении.

Вам необходимо использовать библиотеки CometD как на клиенте (javascript, так и java) и на server, и все будет работать.

+0

Спасибо за ваш ответ. К сожалению, клиент является встроенным устройством, он закодирован в исходных сокетах C++, мы не можем использовать CometD. Знаете ли вы, как CometD отправляет эти сообщения? Поскольку на основании вашего третьего абзаца длительный опрос по-прежнему один запрос соответствует одному из ответов, эти сообщения о сердцебиении не должны отправляться через это длинное соединение для опроса, иначе это один запрос на несколько ответов, это потоковая передача HTTP, а не HTTP длительный опрос. Открывает ли CometD еще одно соединение для сообщений с биением? Как настроить CometD для отправки этих сообщений? – Tiensbakung

+0

Для передачи сообщений CometD использует протокол под названием [Bayeux] (http://docs.cometet.org/3/reference/#_bayeux), используя HTTP или WebSocket. Для каждого ответа HTTP длинного опроса CometD может отправлять многие сообщения Bayeux. Это не потоковая передача, это чистый длинный опрос. Если вы хотите использовать CometD (и я действительно имею в виду [этот проект] (http://cometd.org)) на сервере, с клиентом C++ (который CometD не предоставляет), тогда вам нужно реализовать протокол Bayeux C++ клиент. [Компания за CometD] (https://webtide.com) может [помочь вам] (http://docs.cometd.org/3/reference/#_support) об этом. – sbordet

 Смежные вопросы

  • Нет связанных вопросов^_^