Cómo implementar WebSocket en Tomcat
El Protocolo WebSocket pertenece al estándar HTML5, y cada vez más navegadores tienen WebSocket de forma nativa, lo que permite a los clientes y servidores lograr una comunicación bidireccional. Después de establecer una conexión WebSocket entre el cliente y el servidor, el mensaje del lado del servidor se puede enviar directamente al cliente, rompiendo así el modo de respuesta de solicitud tradicional y evitando las solicitudes sin sentido. Por ejemplo, la forma tradicional puede usar AJAX para solicitar continuamente el lado del servidor, mientras que WebSocket puede enviar directamente los datos al cliente y el cliente no tiene que solicitarlo. Al mismo tiempo, gracias al soporte nativo del navegador, escribir aplicaciones de clientes se ha vuelto más conveniente y no es necesario confiar en complementos de terceros. Además, el protocolo WebSocket abandona los engorrosos encabezados de solicitud del protocolo HTTP, pero lo transmite en forma de marcos de datos, lo cual es más eficiente.
La imagen muestra el proceso de comunicación del protocolo WebSocket. Primero, el cliente enviará un paquete de apretón de manos para decirle al servidor que quiero actualizar a WebSocket. No sé si su servidor está de acuerdo. En este momento, si el servidor admite el protocolo WebSocket, devolverá un paquete de apretón de manos para decirle al cliente que no hay problema y la actualización ha sido confirmada. Luego se estableció con éxito una conexión WebSocket, que admite la comunicación bidireccional y envía mensajes utilizando el formato de cuadro de datos del Protocolo WebSocket.
El proceso de apretón de manos debe explicarse. Para que el protocolo WebSocket sea compatible con la arquitectura web del protocolo HTTP existente, el apretón de manos del protocolo WebSocket debe basarse en el protocolo HTTP. Por ejemplo, el cliente enviará mensajes HTTP de manera similar a la siguiente a la solicitud del servidor para actualizar al Protocolo WebSocket. La actualización: WebSocket le dice al servidor que quiero actualizar el protocolo:
Obtener ws: // localhost: 8080/hola http/1.1 Origin: http: // localhost: 8080 Conexión: actualización Host: localhost: 8080 sec-websocket-key: urovsczjnol/umBtt5ukmw == Actualización: WebSocket Sec-Websocket-Version: 13
En este momento, si el servidor admite el protocolo WebSocket, enviará un mensaje que acepta el protocolo de actualización del cliente. El mensaje específico es similar al siguiente, donde la actualización: WebSocket le dice al cliente que acepto su protocolo de actualización:
HTTP/1.1 101 WebSocket Protocolo Handshake Fecha: viernes 10 de febrero de 2016 17:38:18 Conexión GMT: Actualización del servidor: Kaazing Gateway Actualización: WebSocket SEC-Websocket-Accept: RLHCKW/SKSO9GAH/ZSFHBATDKRU =
Después de completar el apretón de manos como se indicó anteriormente, la conexión del protocolo HTTP está rota. A continuación, comienza a usar el protocolo WebSocket para comunicarse entre las dos partes. Esta conexión sigue siendo la conexión TCP/IP original, y el puerto sigue siendo el 80 o 443 original.
Aquí hay un ejemplo simple de escribir WebSocket en Tomcat:
clase pública HELLOWEBSOCKETServlet extiende WebSocketServlet {Lista estática privada <SmessageInbound> SocketList = New ArrayList <SceseSInbound> (); CreateWebSocketInBound de createBsocketInBound protegido (String Subprotocol, HttpServletRequest) {return New WebSocketMessageInBound (); } public class WebSocketMessageInbound extiende MessageInbound {Protected Void OnClose (int status) {super.onclose (status); SocketList.remove (esto); } protegido void onopen (wsoutbound outbound) {super.onopen (saliendo); SocketList.Add (esto); } @Override protegido void onbinaryMessage (bytebuffer Mensaje) lanza ioexception {} @Override protegido void ontextMessage (Charbuffer Mensaje) lanza IOException {para (MessageInbound MessageInbound: SocketList) {Charbuffer Buffer = Charbuffer.wrap (mensaje); Wsoutbound outbound = messageInbound.getWSoutBound (); ourbound.writeTextMessage (buffer); ourbound.flush (); }}}}Este servlet debe heredar el WebSocketServlet y luego crear una clase WebSocketMessageInbound que herede MessageInbound. Uplica el Onclose, Onopen, OnbinaryMessage y OntextMessage en esta clase para completar la lógica de cada evento. Onopen se llamará cuando se establece una conexión WebSocket, se llamará a OnClose cuando se cierra WebSocket, se llama a OnBinaryMessage cuando se reciben datos de un cliente en modo binario y se llama a OnTextMessage cuando se recibe datos de un cliente en el modo de texto. El código anterior implementa el efecto de una transmisión.
Según la lógica de procesamiento anterior, la integración de Tomcat de WebSocket no será demasiado difícil. Significa que si se encuentra con una solicitud de protocolo WebSocket al procesar una solicitud, realizará un procesamiento especial, mantendrá la conexión y llamará a los métodos MessageSinbound de OnClose, Onopen, OnbinaryMessage y OnTextMessage de WebSocketServlet en el momento apropiado. Dado que WebSocket generalmente se recomienda utilizar en modo NIO, mire el protocolo WebSocket de integración del modo NIO.
Como se muestra en la figura, si el receptor recibe la conexión del cliente del WebSocket y se registra en la cola de niochannel, el componente del encol solo depende de si hay un niochannel para manejar. Si es así, pasará por la tubería de procesamiento al servlet heredando el WebSocketServlet. El método DoGet del WebSocketServlet manejará el apretón de manos de WebSocket y le dirá al cliente de retorno que acepte el Acuerdo de actualización. Más tarde, Poller continuó turnando para despegar el niochannel relacionado. Una vez que se descubrió que se utilizó la tubería utilizando el Protocolo WebSocket, llamaría al método MessageInbound para completar el procesamiento de diferentes eventos, logrando así el soporte para el Protocolo WebSocket.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!