0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: сервлеты, websocket, long polling, java enterprise, поллинг, java ee, двунаправленная коммуникация, tcp, нттр, handshake, ws/wss, html5, server sent events, jax-rs, rest-сервис</p>
1
<p>Теги: сервлеты, websocket, long polling, java enterprise, поллинг, java ee, двунаправленная коммуникация, tcp, нттр, handshake, ws/wss, html5, server sent events, jax-rs, rest-сервис</p>
2
<p>Необходимость коммуницировать клиенту и серверу существует не только в Java EE-приложениях, но и в любых других веб-приложениях. Как известно, для этих целей используются различные подходы, например, поллинг. При поллинге клиент периодически опрашивает сервер, отправляя клиентский запрос, а тот в свою очередь формирует ответ на него.</p>
2
<p>Необходимость коммуницировать клиенту и серверу существует не только в Java EE-приложениях, но и в любых других веб-приложениях. Как известно, для этих целей используются различные подходы, например, поллинг. При поллинге клиент периодически опрашивает сервер, отправляя клиентский запрос, а тот в свою очередь формирует ответ на него.</p>
3
<p>То есть для поддержки актуального состояния данных, клиент должен постоянно опрашивать сервер для получения обновлённых данных. Такой подход не всегда удобен, так как требует дополнительных накладных расходов и действий со стороны клиента (если обновление данных на сервере не произошло, сеть нагружается впустую). Устранить некоторые недостатки поллинга помогают его разновидности, тот же<strong>Long polling</strong>.</p>
3
<p>То есть для поддержки актуального состояния данных, клиент должен постоянно опрашивать сервер для получения обновлённых данных. Такой подход не всегда удобен, так как требует дополнительных накладных расходов и действий со стороны клиента (если обновление данных на сервере не произошло, сеть нагружается впустую). Устранить некоторые недостатки поллинга помогают его разновидности, тот же<strong>Long polling</strong>.</p>
4
<p>Мейнстримной технологией отправки уведомлений от клиента к серверу и обратно на сегодняшний день является технология<strong>WebSocket</strong>. Веб-сокеты впервые были представлены в Java EE 7-й редакции. Они позволяют организовывать двунаправленную (полнодуплексную) коммуникацию между клиентом и сервером, используя в качестве основы протокол<strong>TCP</strong>. При этом тот самый протокол<strong>НТТР</strong>, который применялся для поллинга, используется единожды для осуществления так называемого "рукопожатия" (<strong>handshake</strong>), которое позволяет клиенту и серверу установить соединение между собой. В последующем обмен информацией между взаимодействующими сторонами происходит посредством более высокоуровневого протокола<strong>ws/wss</strong>.</p>
4
<p>Мейнстримной технологией отправки уведомлений от клиента к серверу и обратно на сегодняшний день является технология<strong>WebSocket</strong>. Веб-сокеты впервые были представлены в Java EE 7-й редакции. Они позволяют организовывать двунаправленную (полнодуплексную) коммуникацию между клиентом и сервером, используя в качестве основы протокол<strong>TCP</strong>. При этом тот самый протокол<strong>НТТР</strong>, который применялся для поллинга, используется единожды для осуществления так называемого "рукопожатия" (<strong>handshake</strong>), которое позволяет клиенту и серверу установить соединение между собой. В последующем обмен информацией между взаимодействующими сторонами происходит посредством более высокоуровневого протокола<strong>ws/wss</strong>.</p>
5
<p>Чтобы поток обмена был двунаправленным, у клиента и сервера есть все необходимые средства для передачи данных, и вне зависимости от того, кто будет инициирующей стороной. Если клиент хочет синхронизировать состояние с сервером, он отправляет соответствующие данные, а если серверу есть, что сообщить клиенту, - он посылает порцию необходимых данных, зачастую в виде дельты от первоначального объёма информации.</p>
5
<p>Чтобы поток обмена был двунаправленным, у клиента и сервера есть все необходимые средства для передачи данных, и вне зависимости от того, кто будет инициирующей стороной. Если клиент хочет синхронизировать состояние с сервером, он отправляет соответствующие данные, а если серверу есть, что сообщить клиенту, - он посылает порцию необходимых данных, зачастую в виде дельты от первоначального объёма информации.</p>
6
<p>При этом серверу при таком подходе нет необходимости дожидаться запроса от клиента для уведомления об изменениях. Если происходят какие-либо обновления, сервер отправляет все необходимые данные, а клиент их вновь отображает. После взаимного обмена информаций общение завершается, а соединение закрывается.</p>
6
<p>При этом серверу при таком подходе нет необходимости дожидаться запроса от клиента для уведомления об изменениях. Если происходят какие-либо обновления, сервер отправляет все необходимые данные, а клиент их вновь отображает. После взаимного обмена информаций общение завершается, а соединение закрывается.</p>
7
<p>Вышеперечисленные подходы применяются довольно широко. Однако в некоторых случаях решить задачи, с которыми может столкнуться современный разработчик, дополнительно помогает ещё один механизм -<strong>Server Sent Events</strong>.</p>
7
<p>Вышеперечисленные подходы применяются довольно широко. Однако в некоторых случаях решить задачи, с которыми может столкнуться современный разработчик, дополнительно помогает ещё один механизм -<strong>Server Sent Events</strong>.</p>
8
<h2>Особенности работы Server Sent Events</h2>
8
<h2>Особенности работы Server Sent Events</h2>
9
<p>Начиная с<strong>HTML5</strong>, появилась возможность однонаправленной коммуникации от сервера к клиенту, генерируя события, приводящие к обновлению данных на клиенте. Этот подход позволяет расширять возможности клиента и актуализировать данные без лишних обращений со стороны клиента, например, получая уведомления о различных событиях.</p>
9
<p>Начиная с<strong>HTML5</strong>, появилась возможность однонаправленной коммуникации от сервера к клиенту, генерируя события, приводящие к обновлению данных на клиенте. Этот подход позволяет расширять возможности клиента и актуализировать данные без лишних обращений со стороны клиента, например, получая уведомления о различных событиях.</p>
10
<p>Данная технология не обошла стороной Java EE и используется в ней, начиная с восьмой версии. Прежде всего данный подход нашл отражение в двух распространённых технологиях Java EE: сервлеты и<strong>JAX-RS</strong>.</p>
10
<p>Данная технология не обошла стороной Java EE и используется в ней, начиная с восьмой версии. Прежде всего данный подход нашл отражение в двух распространённых технологиях Java EE: сервлеты и<strong>JAX-RS</strong>.</p>
11
<p>Говоря о<strong>Server Sent Events</strong>с практической точки зрения, можно привести следующий пример REST-сервиса:</p>
11
<p>Говоря о<strong>Server Sent Events</strong>с практической точки зрения, можно привести следующий пример REST-сервиса:</p>
12
@GET @Produces(MediaType.SERVER_SENT_EVENTS) public void news(@Context SseEventSink eventSink, @Context Sse sse) { try(SseEventSink sink = eventSink){ sink.send(sse.newEvent("data")); sink.send(sse.newEvent("MyEventName","more data")); OutboundSseEvent event = sse.newEventBuilder(). id("EventId"). name("EventName"). data("Data"). reconnectDelay(10000). comment("Anything i wanna comment here!"). build(); sink.send(event); } }<h2>Вот, собственно, и всё</h2>
12
@GET @Produces(MediaType.SERVER_SENT_EVENTS) public void news(@Context SseEventSink eventSink, @Context Sse sse) { try(SseEventSink sink = eventSink){ sink.send(sse.newEvent("data")); sink.send(sse.newEvent("MyEventName","more data")); OutboundSseEvent event = sse.newEventBuilder(). id("EventId"). name("EventName"). data("Data"). reconnectDelay(10000). comment("Anything i wanna comment here!"). build(); sink.send(event); } }<h2>Вот, собственно, и всё</h2>
13
<p>Получить более подробную информацию вы всегда можете на интерактивных занятиях курса<a>"Разработчик Java Enterprise"</a>.</p>
13
<p>Получить более подробную информацию вы всегда можете на интерактивных занятиях курса<a>"Разработчик Java Enterprise"</a>.</p>
14
<p><em>Интересуют нюансы работы Server Sent Events? Задавайте вопросы в комментариях!</em></p>
14
<p><em>Интересуют нюансы работы Server Sent Events? Задавайте вопросы в комментариях!</em></p>
15
15