Как реализовать WebSocket в Tomcat
Протокол WebSocket принадлежит стандарту HTML5, и все больше и больше браузеров имеют национально поддерживаемый WebSocket, что позволяет клиентам и серверам достигать двусторонней связи. После установления соединения WebSocket между клиентом и сервером сообщение на стороне сервера может быть отправлено непосредственно на клиент, тем самым нарушая традиционный режим ответа на запрос и избегая бессмысленных запросов. Например, традиционный способ может использовать Ajax для постоянного запроса на сторону сервера, в то время как WebSocket может напрямую отправлять данные клиенту, а клиент не должен его запросить. В то же время, благодаря поддержке нативного браузера, написание клиентских приложений стало более удобным и не нужно полагаться на сторонние плагины. Кроме того, протокол WebSocket отказывается от громоздких заголовков запроса протокола HTTP, но передает его в виде рамных рам, что является более эффективным.
На рисунке показан процесс связи протокола WebSocket. Во -первых, клиент отправит пакет рукопожатия, чтобы сообщить серверу, что я хочу перейти на WebSocket. Я не знаю, согласен ли ваш сервер. В настоящее время, если сервер поддерживает протокол WebSocket, он вернет пакет рукопожатия, чтобы сообщить клиенту, что нет проблем, и обновление было подтверждено. Затем было успешно установлено подключение к WebSocket, которое поддерживает двустороннюю связь и отправляет сообщения с использованием формата кадра данных протокола WebSocket.
Процесс рукопожатия должен быть объяснен. Чтобы сделать протокол WebSocket совместимым с существующей веб -архитектурой протокола HTTP, рукопожатие протокола WebSocket должно основываться на протоколе HTTP. Например, клиент отправит HTTP -сообщения, аналогичные следующему в запрос сервера для обновления до протокола WebSocket. Обновление: WebSocket сообщает серверу, что я хочу обновить протокол:
Получить WS: // Localhost: 8080/Привет http/1.1 Происхождение: http: // localhost: 8080 Соединение: Обновление хост: Localhost: 8080 Sec-Websocket-key: urovsczjnol/umbtt5ukmw == Обновление: WebSocket Sec-Websocket-vervion: 13
В настоящее время, если сервер поддерживает протокол WebSocket, он отправит сообщение, которое согласится с протоколом обновления клиента. Конкретное сообщение аналогично следующему, где обновление: WebSocket сообщает клиенту, что я согласен с вашим протоколом обновления:
Http/1.1 101 WebSocket Protocol Дата рукопожатия: пт, 10 февраля 2016 г. 17:38:18 Подключение GMT: Обновление Сервер: Каазинг Шлюз Обновление: WebSocket Sec-WebSocket-Accep
После завершения рукопожатия, как указано выше, соединение протокола HTTP нарушено. Затем вы начинаете использовать протокол WebSocket для связи между двумя сторонами. Это соединение по -прежнему является исходным соединением TCP/IP, а порт по -прежнему остается исходным 80 или 443.
Вот простой пример написания WebSocket в Tomcat:
открытый класс hellowebsocketservlet Extends websocketservlet {private Static List <somersInbound> socketlist = new ArrayList <sesgnforyInbound> (); Защищенная потока CreateWebeSocketInbound (String Subprotocol, httpservletrequest) {return new WebSocketCocketMessAgeInbound (); } открытый класс webSocketCocketInbound Extends MessageInbound {Protected void onclose (int status) {super.onclose (status); socketlist.remove (это); } защищенный void onoPen (wsoutbound outbound) {super.onopen (исходный); SocketList.Add (это); } @Override Protected void OnBinaryMessage (ByteBuffer Message) бросает ioException {} @Override Protected void OntextMessage (charbuffer message) Throws ioException {для (MessageInbound MessageInBound: SocketList) {charbuffer buffer = charbuffer.wrap (сообщение); Wsoutbound outbound = messageInbound.getWsoutBound (); outbound.writetextmessage (буфер); outbound.flush (); }}}}Этот сервлет должен наследовать веб -сайт -эверлет, а затем создать класс WebSocketCocketMessAgeInbound, который наследует MessageInbound. Заполняйте в этом классе Onclose, OnoPen, OnBinaryMessage и OnTextMessage, чтобы завершить логику каждого события. OnoPen будет вызвана при установке соединения WebSocket, OnClose будет вызвана, когда веб -сокет будет закрыт, onBinaryMessage вызывается, когда данные клиента получают в двоичном режиме, а OnTextMessage вызывается, когда данные клиента получают в текстовом режиме. Приведенный выше код реализует эффект трансляции.
Согласно вышеуказанной логике обработки, интеграция WebSocket Tomcat не будет слишком сложной. Это означает, что если вы столкнетесь с запросом протокола WebSocket при обработке запроса, вы будете выполнять специальную обработку, сохранить соединение и позвонить в Onclose, OnoPen, OnBinaryMessage и OnTextMessage of WebSocketServlet Messessbound, в соответствующем времени. Поскольку WebSocket обычно рекомендуется использовать в режиме NIO, посмотрите на протокол интеграции NIO Integration WebSocket.
Как показано на рисунке, если клиент -подключение к WebSocket получено получателем и зарегистрировано в очереди NioChannel, компонент Poller продолжает опираться на то, есть ли NioChannel для обработки. Если это так, он пройдет через обработку конвейера до сервлета, наследуя веб -сайт. Метод Doget WebSocketServlet будет обрабатывать рукопожатие WebSocket и сообщить возвращению клиента согласиться с соглашением об обновлении. Позже Поллер продолжал по очереди, чтобы снять связанный Niochannel. После того, как было обнаружено, что использовался трубопровод с использованием протокола WebSocket, он позвонил бы в методе MessageInBound для завершения обработки различных событий, тем самым достигнув поддержки протокола WebSocket.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!