С разработкой Интернета традиционные протоколы 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 и использует WebSocket для реализации чата.
Javaee 7 создал JSR-356: Java API для спецификации WebSocket. Многие веб -контейнеры, такие как Tomcat, Nginx, причал и т. Д., Поддерживают WebSocket. Tomcat поддерживает WebSocket с 7.0.27 и JSR-356 с 7.0.47. Следующий код также должен быть запущен на Tomcat7.0.27 или выше.
Код сервера WebSocket
// Эта аннотация используется для указания URI, с помощью которого клиент может подключаться к WebSocket. Сервлетоподобное картирование аннотаций. Не нужно настраивать его в web.xml. @Serverendpoint ("/websocket") открытый класс WebSocketDemo {// Статическая переменная, используемая для записи текущего количества онлайн -соединений. Он должен быть спроектирован так, чтобы быть защищенным. Частный статический финальный Atomicinteger onlineCount = new Atomicinteger (0); // Регистрационный набор параллельного пакета используется для хранения соответствующего объекта MyWebSocket каждого клиента. Чтобы понять, что сервер связывается с одним клиентом, вы можете использовать карту для ее хранения, где ключ может идентифицировать пользователя частного статического CopyonWritearRaySet <websocketDemo> webSocketSet = new CopeOnWritearRaySet <websocketDemo> (); // Определите прозвище чата, в котором записывает клиент частное прозвище финальной строки; // подключить сеанс подключения с определенным клиентом, и вам необходимо отправить данные на частную сеанс клиента; public websocketDemo () {nickname = "uege" + onlinecount.getandincrement (); } / * * Используйте аннотацию @onopen, чтобы указать возврат после успешной ссылки клиента. Сеанс параметра является необязательным параметром. Этот сеанс является сеансом в спецификации WebSocket, представляющий сеанс. Не httpsession */ @onopen public void onopen (session session) {this.session = session; websocketset.add (это); String message = string.format ("[%s,%s]", псевдоним "добавить в комнату чата"); вещание (сообщение); System.out.println ("onopen"); }/ * * Используйте аннотацию @onmessage, чтобы указать, когда клиент отправляет сообщение, а первый параметр указывает данные, отправленные пользователем. Сеанс параметра является необязательным параметром, который согласуется с сеансом в методе OnoPen */@onmessage public void onmessage (строковое сообщение, сеанс сеанса) {// Конечно True System.out.println (this.session == Session); Broadcast (string.format ("%s:%s", псевдоним, фильтр (сообщение))); }/ ** Обратный вызов После того, как пользователь разбивает ссылку, обратите внимание, что этот метод должен быть вызван после того, как клиент вызывает метод сломанной ссылки*/ @onclose public void onclose () {websocketset.remove (this); String message = string.format ("[%s,%s]", псевдоним "оставить ссылку на чат"); вещание (сообщение); } // Полная масса Отправить private void Broadcast (string info) {for (webSocketDemo w: websocketset) {try {synchronized (websocketdemo.class) {w.session.getBasicRemote (). SendText (info); }} catch (ioException e) {System.out.println ("Отправить сообщение клиенту"+w.nickName+"Не удалось отправить сообщение"); websocketset.remove (w); try {w.session.close (); } catch (ioException e1) {} string message = string.format ("[%s,%s]", w.nickname, "densuncted"); вещание (сообщение); }}} // может сделать несколько запросов фильтрации для пользовательских сообщений, таких как блокировка ключевых слов и т. Д. Полем public Static String Filter (String Message) {if (message == null) {return null; } вернуть сообщение; }}Клиент (веб -домашняя страница) код:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <Title> вставьте заголовок здесь </title> <script type = "text/javascript"> var ws = new WebSocket ("ws: // localhost: 8080/websockettest/websocket"); / * * Слушайте изменения в трех состояниях. JS будет обратный вызов*/ ws.onopen = function (сообщение) {}; ws.onclose = function (сообщение) {}; ws.onmessage = function (сообщение) {showmessage (message.data); }; // Слушайте событие закрытия окна. Когда окно закрыто, активно закрывайте соединение WebSocket, чтобы предотвратить закрытие окна, прежде чем соединение будет отключено, и сторона сервера будет бросить исключения. window.onbeforeunload = function () {ws.close (); }; // ЗАКРЫТЬ ФУНКЦИЯ СОЕДИНЕНИЯ CloseWebSocket () {ws.close (); } // Отправить функцию сообщения send () {var input = document.getElementbyid ("msg"); var text = input.value; Ws.send (текст); input.value = ""; } function showmessage (message) {var text = document.createTextNode (message); var br = document.createElement ("br") var div = document.getElementbyId ("showChatMessage"); div.appendchild (текст); div.appendchild (br); }</script></head><body> <div id="show"> <div id="showChatMessage"></div> <input type="text" size="80" id="msg" name="msg" placeholder="enter chat content" /> <input type="button" value="send" id="sendBn" name="sendBn" name="sendBn" onclick = "send ()"> </body> </html>Как упомянуто выше, заполняется чат с функцией группового чата. В процессе проверки было обнаружено, что использование WebSocket может выполнять перекрестные запросы.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.