1. Краткое введение в WebSocket
Протокол WebSocket - это новый протокол для HTML5. Он реализует полнодуплексную связь между браузером и сервером. Первоначальное рукопожатие требует помощи HTTP -запросов для завершения рукопожатия.
С разработкой Интернета традиционные протоколы HTTP было трудно удовлетворить все более сложные потребности веб -приложений. В последние годы, с рождением HTML5, был предложен протокол WebSocket. Он реализует полнодуплексную связь между браузером и сервером, расширяет функцию связи между браузером и сервером и позволяет серверу активно отправлять данные клиенту.
Фон WebSocket
Только одностороннее общение может быть достигнуто с помощью HTTP в браузере. Комета может в определенной степени моделировать двустороннюю связь, но она имеет низкую эффективность и требует хорошей поддержки от сервера; Сокет и XMLSocket во Flash могут реализовать истинную двустороннюю связь, и эти две функции могут использоваться в JavaScript через Flex Ajax Bridge. Может быть предсказуемо, что если WebSocket будет реализован в браузере, он заменит две вышеупомянутые технологии и будет широко использоваться. Столкнувшись с этой ситуацией, HTML5 определяет протокол WebSocket, который может лучше сохранить ресурсы сервера и пропускную способность и достичь связи в реальном времени.
Протокол WebSocket также реализован в Javaee7.
Мы знаем, что традиционный протокол HTTP не содержит сохранения состояния. Каждый запрос должен быть инициирован клиентом (например, браузер). После обработки сервер возвращает результат ответа. Серверу трудно активно отправлять данные клиенту. Этот вид клиента является активной стороной, а сервер - пассивная сторона. Традиционная веб-модель вызывает меньшие проблемы для веб-приложений с нечастыми изменениями информации, но она доставляет большие неудобства для веб-приложений, связанных с информацией в реальном времени, таких как приложения с такими функциями, как мгновенное общение, данные в реальном времени, подписку и т. Д. До предложения спецификации WebSocket, разработчики часто используют коммерческие решения для реализации этих функций в реальном времени: опрос и коммутационных технологий. На самом деле, последнее, по сути, является своего рода опросом, но он был улучшен.
Опрос-самое оригинальное решение для реализации веб-приложений в реальном времени. Технология опроса требует, чтобы клиенты периодически отправляли запросы на сервер в установленном интервале времени и часто запрашивают, есть ли новые изменения данных. Очевидно, что этот подход может привести к слишком много ненужных запросов, тратить трафик и ресурсы сервера.
Технология COMET можно разделить на длинные избирательные и потоковые технологии. Длительный опрос улучшает вышеупомянутую технологию опроса, уменьшая бесполезные запросы. Он устанавливает время истечения для определенных данных и отправляет запрос на сервер только после истечения срока действия данных; Этот механизм подходит для ситуаций, когда изменения данных не являются особенно частыми. Технология потоковой передачи обычно относится к клиенту, использующему скрытое окно, чтобы установить длинное соединение HTTP с сервером. Сервер будет постоянно обновлять состояние подключения, чтобы поддерживать длительное соединение HTTP; Таким образом, сервер может активно отправлять данные клиенту через это длинное соединение; Технология потоковой передачи может проверить производительность сервера в большой среде параллелизма .
Обе технологии основаны на режиме запроса-ответа и не считаются технологиями в реальном времени в истинном смысле; Каждый запрос или ответ их отходов определяет определенное количество трафика на одном и том же заголовке, и сложность развития также высока.
С запуском HTML5 WebSocket действительно реализует общение в режиме реального времени, заставляя режим B/S иметь возможности связи в реальном времени режима C/S. Рабочий процесс WebSocket заключается в следующем: браузер отправляет на сервер запрос для установления соединения WebSocket через JavaScript. После того, как подключение WebSocket успешно установлено, клиент и сервер могут передавать данные через соединение TCP. Поскольку подключение к WebSocket, по сути, является соединением TCP, оно не требует повторных данных заголовка, которые должны были переносить с каждой передачей, поэтому объем передачи данных намного меньше, чем избирательные и технологии Comet. Эта статья не вводит спецификацию WebSocket подробно, но в основном представляет реализацию WebSocket в Java Web.
Javaee 7 создал JSR-356: Java API для спецификации WebSocket. Многие веб -контейнеры, такие как Tomcat, Nginx, причал и т. Д., Поддерживают WebSocket. Tomcat поддерживает WebSocket с 7.0.27 и JSR-356 с 7.0.47. Следующий демонстрационный код также должен быть развернут на Tomcat7.0.47 или выше, чтобы запустить.
2. Пример WebSocket
2.1. Создать новый тестовый проект Javaweb
Добавить зависимость пакета JAR в pom.xml
<Depective> <groupid> javax </GroupId> <artifactid> javaee-api </artifactid> <serse>
Клиент (веб -домашняя страница) код:
<%@ page language="java" pageEncoding="UTF-" %><!DOCTYPE html><html><head><title>Tomcat implementation of Java backend WebSocket</title></head><body>Welcome<br/><input id="text" type="text"/><button onclick="send()">Send a message</button><hr/><button onclick="closeWebSocket()">Close WebSocket connection</button><hr/><div id="message"></div></body><script type="text/javascript">var websocket = null;//Determine whether the current browser supports WebSocketif ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:/websocket");}else {alert ('текущий браузер не поддерживает WebSocket')} // Метод обратного вызова для ошибок в соединении websocket.onerror = function () {setMessageInnerhtml ("Ошибки соединения WebSocket в WebSocket");}; // Метод Callback для успешного подключения websocket.onopen = function () {setMessageInnerHtml (websocket connection atempistrization for spessifition for telectivition); websocket.onmessage = function (event) {setMessageInnerhtml (event.data);} // Соединение с закрытым методом обратного вызова websocket.onclose = function () {setmessageinnerhtml ("Подключение websocket connection закрыто");} // Слушание события закрытия окна. Когда окно закрыто, активно закрывайте соединение WebSocket, чтобы предотвратить закрытие окна, прежде чем соединение будет отключено, и сторона сервера будет бросить исключения. window.onbeforeUnload = function () {closeWebSocket ();} // Показать сообщение на функции веб -страницы setMessageInnerhtml (innerhtml) {document.getElementbyId ('Message'). InnerHtml + = innerHtml + '<br/>';} // close websocket function function closebockeocke () {websockeocke (). Функция send () {var message = document.getElementById ('text'). Java Web Backend Code
Пакет me.gacl.websocket; import java.io.ioexception; import java.util.concurrent.copyonwritearraySet; import javax.websocket.*; import javax.websocket.server.serverendpoint;/*** @serverendpoint. Анном-это аннотация класса. Его функция в основном для определения текущего класса как на стороне сервера WebSocket. Значение аннотации будет использоваться для прослушивания подключения пользователя с URL -адресом доступа к терминалу пользователя. Клиент может подключиться к стороне сервера WebSocket через этот URL*/@ServerEndPoint ("/websocket") открытый класс Webockettest {// Статические переменные, используемые для записи текущего количества онлайн -подключений. Он должен быть спроектирован так, чтобы быть защищенным. Private Static intlineCount =; // Набор SAFE-защитника одновременного пакета используется для хранения соответствующего объекта MyWebSocket каждого клиента. Чтобы понять, что сервер связывается с одним клиентом, вы можете использовать карту для ее хранения, где ключ может идентифицировать пользователя частного статического CopyonWritearRaySet <websockettest> websocketset = new CopeonWritearRaySet <webockettest> (); // Сессия подключения с определенным клиентом необходимо отправить в клиент с помощью IT Private Session Session;/*** для успешного вызова подключаемого подключения. Сеанс - это сеанс подключения с определенным клиентом, и ему необходимо отправлять данные клиенту через него*/@onopenpublic void onopen (сеанс сеанса) {this.session = session; websocketset.add (this); // добавить в addonlineCount () в наборе; // Добавить в system.out.println («Существует новое соединение, чтобы присоединиться! Текущее количество людей в Интернете:« + getOnlineCount ());}/*** Метод подключения закрытия вызова*/@onclosepublic void onclose () {websocketSet.remove (this); // DELETE SUBONLINECOUNT () из SET; // Уменьшение онлайн -номеров System.out.println («Закрыто соединение! Текущее число людей в Интернете -« + getOnlineCount ());}/*** Метод, вызванный после получения клиентского сообщения* @param Сообщение, отправленное клиентом* @param session opportanal parameter*/ @onmessagepublic void onMessage (String Message, Session Session) {System.At.print.print. Сообщение); // пакетное сообщение для (websockettest item: websocketset) {try {item.sendmessage (message);} catch (ioexception e) {e.printstacktrace (); продолжение;}}}/*** ошибка) {System.out.println ("Ошибка произошла"); error.printstacktrace ();}/*** Этот метод отличается от вышеуказанных методов. Аннотации нет, это метод, добавленный в соответствии с вашими потребностями. * @param Сообщение* @Throws ioException*/public void sendmessage (строковое сообщение) throws ioException {this.session.getBasicRemote (). sendText (сообщение); // this.session.getAsyncremote (). SendText (сообщение);} public Static Synchronized int getOnlineCount () {return onlinecount; addonlineCount () {websockettest.onlinecount ++;} public static synchronized void subonlinecount () {websockettest.onlinecount--;}} 1.2. Операционный эффект
Откройте браузер Google и браузер Firefox одновременно для тестирования имитации с несколькими клиентами. Эффект работы заключается в следующем:
Приведенный выше контент является примером учебника для реализации WebSocket от бэкэнд Java Tomcat, представленной вам. Я надеюсь, что это будет полезно для всех!