Отправлять данные на передний план, когда серверные обновления - PullRequest
6 голосов
/ 29 декабря 2011

Серверная часть моего веб-приложения получает обновления от нескольких клиентов.Когда такое обновление происходит, оно должно быть передано всем другим клиентам.

Как я могу инициировать обновление с сервера для всех клиентов веб-браузера при обновлении моего бэкэнда?

Я используюJBoss, JSF и Spring Framework.

Ответы [ 3 ]

7 голосов
/ 29 декабря 2011

См. Аналогичную очередь переполнения стека: WebSockets против событий, отправленных сервером / EventSource

Я предполагаю, как и DarthVader, что ваш интерфейс - это (как правило) страница HTML без сохранения состояниякакой-тоЧто-то в браузере.Если вы хотите, чтобы все клиенты автоматически отправляли изменения, у вас есть три варианта:

Comet : (устарело)
Comet, по сути, выполняет запросы AJAX, которые не имеют времени ожидания запросапредел.Вы делаете запрос, и он сидит там и передает данные через него, как это необходимо.Это можно сделать с помощью скрытых iFrames или стандартных XMLHTTPRequests (которые jQuery может обернуть для вас).Подробнее об этом методе можно прочитать здесь .

Длинный опрос:
По сути, вы используете метод javascript setInterval постоянно опрашивать ваш сервер на предмет изменений.Просто установите интервал, который выполняет стандартный запрос AJAX GET к серверу, и при каждом успехе обновляйте свою страницу соответствующим образом.

API браузера

  • HTML5 WebSockets
    Использование любого типа основанного на событиях бэкэнда (Twisted, EventMachine, node.js и т. Д.) Делает WebSockets идеальным решением.Просто сделайте так, чтобы все клиенты зарегистрировались в бэкэнде, и после отправки от любого данного клиента отправьте изменения всем другим клиентам.Вы можете прочитать больше (и увидеть хороший пример) WebSockets на этой странице .Поддержка браузера => canIuse

  • Событие, отправленное сервером (SSE)
    С сервером- отправленные события , сервер может в любое время отправлять новые данные на веб-страницу, отправляя сообщения на веб-страницу.Эти входящие сообщения могут рассматриваться как события + данные внутри веб-страницы.Поддержка браузера => canIuse

2 голосов
/ 29 декабря 2011

Когда вы говорите front end, вы говорите о http-клиенте без состояния.

Вы не можете перенести что-либо с ваших веб-серверов на http или клиентов без состояния.

«Хитрость» для этогоесли вы периодически используете асинхронные вызовы из внешнего интерфейса в ваш внутренний.

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

Таким образом, клиенты не сохраняют состояние.используйте Ajax.

это ясно?

0 голосов
/ 29 декабря 2011

Есть несколько способов обойти это. То, как это должно быть в будущем, - это соблюдение стандартов, таких как Websockets

Пока вы застряли с Comet, который, по сути, отправляет запрос на сервер и сохраняет его открытым (не сигнализирует об окончании ответа) и просто передает через него данные (паркует запрос, который они вызывают).Или периодический опрос, когда вы просто делаете AJAX-запрос к серверу каждый заранее заданный интервал, чтобы спросить, есть ли у сервера что-то новое, чтобы сказать.Само собой разумеется, что первый обходной путь требует поддержки потоковой передачи как на сервере, так и в браузере, но более эффективен в большинстве сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...