1. Краткое введение в WebSocket
С разработкой Интернета традиционные протоколы HTTP было трудно удовлетворить все более сложные потребности веб -приложений. В последние годы, с рождением HTML5, был предложен протокол WebSocket. Он реализует полнодуплексную связь между браузером и сервером, расширяет функцию связи между браузером и сервером и позволяет серверу активно отправлять данные клиенту.
Мы знаем, что традиционный протокол 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 или выше, чтобы запустить.
Клиент (веб -домашняя страница) код:
< %@ page language = "java" pageencoding = "utf-8" %> <! Doctype html> <html> <head> <title> Реализация tomcat java Backend WebSocket </title> </head> <body> добро пожаловать <br/> <input id = typed = "/> <> onclick =" Send Presse () wond wepst witch </> h wind onclick = "()" h wind wyse yember </> h wind <) ">" h wind want a Presse '> "h wind year </> h on" <) "> onclick = "closeWebSocket ()"> Close WebSocket Connection </button> <hr/> <div id = "message"> </div> </body> <script type = "text/javascript"> var websocket = null; // Судят, поддерживает ли текущий браузер webSocket if ('websocket' in window) {websocket = new WebSocket ("ws: //172.16.98.31: 8080/websocket/websocket"); } else {alert ('текущий браузер не поддерживает WebSocket'); } // Метод обратного вызова для ошибок в соединении websocket.onerror = function () {setmessageinnerhtml ("Ошибка в соединении WebSocket"); }; // Метод обратного вызова для успешного соединения websocket.onopen = function () {setmessageinnerhtml ("websocket connection успешно"); } // Метод обратного вызова получения сообщения websocketcocket.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/>'; } // ЗАКРЫТЬ ФУНКЦИЯ Подключения WEBSOCKETECT CLOSTWEBSOCKETOCKE () {webSocket.Close (); } // Отправить функцию сообщения send () {var message = document.getelementbyid ('text'). Value; websocket.send (сообщение); } </script> </html> Java Web Backend Code
Пакет cn.com; импортировать java.io.ioexception; import java.util.concurrent.copyonwritearrayset; import javax.websocket.*; импорт javax.websocket.server.serverendpoint;/*** @serverendpoint Annotation-это аннотация на уровне класса. Его функция в основном для определения текущего класса как на стороне сервера WebSocket. * Значение аннотации будет использоваться для прослушивания подключения пользователя с адресом URL -адреса доступа к терминалу. Клиент может подключиться к стороне сервера WebSocket через этот URL* Каждый раз, когда будет выполнен запрос, будет создан экземпляр*/@serverendpoint ("/websocket") открытый класс WebSockettest {// Статические переменные используются для записи текущего количества онлайн -подключений. Он должен быть спроектирован так, чтобы быть защищенным. частный статический интенсивный onlinecount = 0; // Регистрационный набор параллельного пакета используется для хранения соответствующего объекта MyWebSocket каждого клиента. Чтобы понять, что сервер общается с одним клиентом, вы можете использовать карту для ее хранения, где ключ может идентифицировать пользователя частного статического CopyonWritearRaySet <websockettest> websocketset = new CopeonWritearRaySet <websockettest> (); // сеанс подключения с определенным клиентом должен отправлять данные клиенту через его частную сеанс; /*** Метод для успешного вызова соединения* @param session. Необязательный параметр. Сеанс - это сеанс подключения с клиентом, и он должен отправлять данные клиенту через него*/ @onopen public void onopen (сеанс сеанса) {this.session = session; websocketset.add (это); // добавить в addonlineCount () в наборе; // Добавить 1 онлайн -номера System.out.println («Есть новое соединение, чтобы присоединиться! Текущее количество онлайн -людей - + getOnlineCount ()); } / *** Метод подключения закрывающих вызовов* / @onclose public void onclose () {websocketset.remove (this); // DELETE SUBONLINECOUNT () из SET; // Удалить онлайн -номер по 1 онлайн -номера System.out.println («Закрыто соединение! Текущее количество людей в Интернете - + getOnlineCount ()); } / *** Метод, вызванный после получения клиентского сообщения* @param Сообщение Сообщение, отправленное клиентом* @param session Необязательный параметр* / @onmessage public void onmessage (строковое сообщение, сеанс сеанса) {System.out.println ("Сообщение от клиента:" + message); // пакетное сообщение для (websockettest item: websocketset) {try {item.sendmessage (message); } catch (ioException e) {e.printstackTrace (); продолжать; }}}} / ** * Вызовите, когда возникает ошибка * @param session * @param error * / @onerror public void onerror (сеанс сеанса, ошибка ошибки) {system.out.println ("Произошла ошибка"); error.printstacktrace (); } /*** Этот метод отличается от приведенных выше методов. Аннотации нет, это метод, добавленный в соответствии с вашими потребностями. * @param message * @throhs ioexception */ public void sendmessage (String Message) Throws ioException {this.session.getBasicRemote (). SendText (message); //this.session.getasyncremote().sendText(Message); } public static synchronized int getOnlineCount () {return onlineCount; } public static synchronized void addonLineCount () {webSockettest.onlineCount ++; } public static synchronized void subonlineCount () {websockettest.onlinecount--; }}Откройте два браузера, введите URL и запустите его напрямую
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.