Что такое веб-сокеты Java

Что такое веб-сокеты JavaВеб-сокеты (WebSockets ), возможно, самое интересное нововведение в веб-техноло­гиях со времен появления «Aсинxpoннoгo JavaScript и XML»(AJAX). Они стали популярными с выходом HTML5 и поддерживаются множеством веб-фреймворков.

Однако потребовалось немало времени для создания стабильной и совместимой спе­цификации веб-сокетов.

Модель протокола передачи гипертекста (НТТР) была спроектирована задол­го до того, как стал популярен Интернет, она основывается на простых специфи­кации и дизайне. В традиционной модели НТТР клиент открывает соединение с сервером прикладной части, отправляет HTTP-запрос типа GET, POST, PUT или DELETE, а HTTP-сервер возвращает соответствующий ответ.

Традиционная модель НТТР была обременительной практически для любого приложения, выходящего за пределы простой модели данных «получить и отправить контент«. Представьте себе клиент приложения для интерактивной переписки, в ко­тором участники могут отправлять сообщения в любом порядке и сотни участников могут общаться одновременно.

Для подобных целей стандартный подход «запрос-ответ» налагает слишком сильные ограничения. Первыми попытками обойти эти ограничения стали AJAX и Comet. Оба были основаны на так называемых длинных опросах: открытии НТТР-соединения и поддержании его в активном состоянии (сохранении соединения открытым) посредством незавершения отправки ответа.

С помощью веб-сокетов клиент может создать «сырой» сокет для сервера и осу­ществлять полнодуплексную связь. Поддержка веб-сокетов была введена в JSR-356.

Пакет javax.websocket и его серверный подпакет содержат все относящиеся к веб­ сокетам классы, интерфейсы и аннотации.

Чтобы реализовать веб-сокеты на платформе Java ЕЕ, вам необходимо создать класс конечной точки с методами жизненного цикла веб-сокета, как показано ниже:

Класс Endpoint предоставляет три метода жизненного цикла: onOpen, onClose и onError. Расширяющий его класс должен реализовать как минимум метод onOpen.

Вы можете развернуть конечную точку двумя способами: с помощью конфигу­рации или программными средствами.

Чтобы выполнить развертывание кода ваше при­ложение должно вызвать следующее:

Развернутый веб-сокет доступен на ws://<host>:<port>/<application>/hello. Од­нако лучше использовать конфигурацию с помощью аннотации. При этом та же конечная точка становится кодом который приводится ниже:

Такой подход позволяет вам использовать аннотации, придерживаясь подхода простых Jаvа-объектов в старом стиле (POJO), поскольку вы не расширяете базо­вый класс. У аннотированной конечной точки те же методы жизненного цикла, что и в первом примере кода, но она вводит дополнительный метод жизненного цикла onMessage.

Вместо реализации OnOpen и добавления обработчика onMessage в основанном на аннотациях подходе достаточно реализовать аннотированный метод жизненного цикла onMessage. Вы можете аннотировать с помощью @ОnМеssаgе несколько методов, чтобы получать различные типы данных, такие как String или ByteBuffer для дво­ичных данных.

Реализация веб-сокета со стороны клиента зависит от используемого веб-фрейм­ворка. Как бы то ни было, в следующем фрагменте показана простая версия на языке JavaScript:

Лучшим примером будет отправка сложного объекта в формате нотации объ­ектов JavaScript (JSON), который может быть организован в объект так, как пока­зано в следующем фрагменте:

Веб-сокеты отлично подходят для создания веб-приложений, требующих асин­хронного обмена сохраняемыми сообщениями между клиентом и сервером. Плат­форма Jаvа ЕЕ предоставляет удобную реализацию веб-сокетов.

Конфигурационных настроек и вариантов реализации у них гораздо больше, чем обсуждается здесь. Если мы пробудили у вас интерес к веб-сокетам, рекомендуем заглянуть в руководство Oracle по платформе Java ЕЕ, детальнее рассказывающее о программировании веб­сокетов с помощью Java API.