1. Una breve introducción a WebSocket
Con el desarrollo de Internet, los protocolos HTTP tradicionales han sido difíciles de satisfacer las necesidades cada vez más complejas de las aplicaciones web. En los últimos años, con el nacimiento de HTML5, se ha propuesto el protocolo WebSocket. Se da cuenta de la comunicación dúplex entre el navegador y el servidor, expande la función de comunicación entre el navegador y el servidor, y permite que el servidor envíe activamente datos al cliente.
Sabemos que el protocolo HTTP tradicional es apátrido. Cada solicitud debe ser iniciada por el cliente (como un navegador). Después del procesamiento, el servidor devuelve el resultado de la respuesta. Es difícil para el servidor enviar activamente datos al cliente. Este tipo de cliente es la fiesta activa y el servidor es la parte pasiva. El modelo web tradicional causa menos problemas para las aplicaciones web con cambios de información poco frecuentes, pero trae grandes inconvenientes a las aplicaciones web que involucran información en tiempo real, como aplicaciones con funciones como comunicación instantánea, datos en tiempo real, impulso de suscripción, etc. Antes de que se proponga la especificación de WebSocket, los desarrolladores a menudo usan soluciones de compensación para implementar estas funciones en tiempo real: encopulaciones y tecnologías de bienes comunes. De hecho, este último es esencialmente un tipo de votación, pero se ha mejorado.
La encuesta es la solución más original para implementar aplicaciones web en tiempo real. La tecnología de votación requiere que los clientes envíen solicitudes periódicamente al servidor a un intervalo de tiempo establecido y consulten con frecuencia si hay nuevos cambios de datos. Obviamente, este enfoque puede conducir a demasiadas solicitudes innecesarias, desperdiciando el tráfico y los recursos del servidor.
La tecnología de cometa se puede dividir en largas tecnologías de votación y transmisión. Las encuestas largas mejora la tecnología de votación mencionada anteriormente, reduciendo las solicitudes inútiles. Establece un tiempo de vencimiento para ciertos datos, y solo envía una solicitud al servidor después de que expire los datos; Este mecanismo es adecuado para situaciones en las que los cambios en los datos no son particularmente frecuentes. La tecnología de transmisión generalmente se refiere al cliente utilizando una ventana oculta para establecer una conexión HTTP Long con el servidor. El servidor actualizará constantemente el estado de conexión para mantener viva la conexión HTTP Long; De esta manera, el servidor puede enviar activamente datos al cliente a través de esta larga conexión; La tecnología de transmisión puede probar el rendimiento del servidor en un entorno de concurrencia grande.
Ambas tecnologías se basan en el modo de solicitud de solicitud y no se consideran tecnologías en tiempo real en el sentido verdadero; Cada solicitud o respuesta de sus desechos una cierta cantidad de tráfico en la misma información del encabezado, y la complejidad del desarrollo también es alta.
Con el lanzamiento de HTML5, WebSocket realmente realiza la comunicación en tiempo real de la web, lo que hace que el modo B/S tenga las capacidades de comunicación en tiempo real del modo C/S. El flujo de trabajo de WebSocket es el siguiente: el navegador envía una solicitud al servidor para establecer una conexión WebSocket a través de JavaScript. Después de establecer correctamente la conexión WebSocket, el cliente y el servidor pueden transmitir datos a través de la conexión TCP. Debido a que la conexión WebSocket es esencialmente una conexión TCP, no requiere que los datos de encabezado repetidos se transporten con cada transmisión, por lo que su volumen de transmisión de datos es mucho más pequeño que la encuesta y la tecnología de cometas. Este artículo no presenta la especificación de WebSocket en detalle, pero presenta principalmente la implementación de WebSocket en Java Web.
Javaee 7 ha creado JSR-356: API Java para la especificación de WebSocket. Muchos contenedores web, como Tomcat, Nginx, Jetty, etc., admiten WebSocket. Tomcat admite WebSocket desde 7.0.27 y JSR-356 desde 7.0.47. El siguiente código de demostración también debe implementarse en Tomcat7.0.47 o superior para ejecutarse.
Código del cliente (página de inicio web):
< %@ page lenguaje = "java" pageEncoding = "utf-8" %> <! DocType html> <html> <fead> <title> Tomcat Implementación de Java Backend WebSocket </title> </Et Head> <Body> Welcome <br/> <input id = "Text" Type = "Text"/> <Bootin OnClick = "Send ()" Send un mensaje </Hrr/Button onClick = "CloseWebSocket ()"> Close WebSocket Connection </boton> <hr/> <div id = "mensaje"> </div> </body> <script type = "text/javaScript"> var websocket = null; // juzga si el navegador actual admite WebSocket if ('WebSocket' en Window) {WebSocket = new WebSocket ("ws: //172.16.98.31: 8080/websocket/websocket"); } else {alerta ('El navegador actual no es compatible con WebSocket'); } // Método de devolución de llamada para errores en conexión WebSocket.Onerror = function () {setMessageInnerHtml ("Error en WebSocket Conexión"); }; // Método de devolución de llamada para una conexión exitosa WebSocket.Onopen = function () {setMessageInnerHtml ("WebSocket Connection exitoso"); } // Método de devolución de llamada para recibir el mensaje websocket.onmessage = function (event) {setMessageInnerHtml (event.data); } // Método de devolución de llamada para cerrar WebSocket.Onclose = function () {setMessageInnerHtml ("WebSocket Connection cerrado"); } // Escuche el evento de cierre de la ventana. Cuando la ventana esté cerrada, cierre activamente la conexión WebSocket para evitar que la ventana se cierre antes de que la conexión esté desconectada, y el lado del servidor arrojará excepciones. Window.onbeforeNeNLOAD = function () {CloseWebSocket (); } // Mostrar el mensaje en la función de la página web setMessageInnerHtml (innerhtml) {document.getElementById ('Mensaje'). InnerHtml + = InnerHtml + '<br/>'; } // Cerrar la función de conexión de WebSocket CloseWebSocket () {WebSocket.close (); } // Enviar función de mensaje send () {var Message = document.getElementById ('Text'). Valor; websocket.send (mensaje); } </script> </html> Código de backend web Java
paquete cn.com; import java.io.ioexception; import java.util.concurrent.copyonwriteArrayset; import javax.websocket.*; import javax.websocket.server.serverendpoint;/*** @serverendpoint annotation es una anotación de nivel de clase. Su función es principalmente para definir la clase actual como un lado del servidor WebSocket. * El valor de anotación se utilizará para escuchar la conexión del usuario con la dirección de URL de acceso terminal. El cliente puede conectarse al lado del servidor WebSocket a través de esta URL* Cada vez que se realiza una solicitud, se creará una instancia*/@ServerEndpoint ("/WebSocket") Public Class WebSockettest {// Se utilizan variables estáticas para registrar el número actual de conexiones en línea. Debe estar diseñado para ser seguro de hilo. privado estático int onlinecount = 0; // El conjunto de hilo seguro del paquete concurrente se utiliza para almacenar el objeto MyWebSocket correspondiente de cada cliente. Para darse cuenta de que el servidor se comunica con un solo cliente, puede usar el mapa para almacenarlo, donde la clave puede identificar al usuario el usuario static static writeArraySet <WebSockettest> WebSocketSet = new CopyOnwriteArySet <ScSockettest> (); // La sesión de conexión con cierto cliente necesita enviar datos al cliente a través de la sesión de sesión privada de TI; /*** Método para llamar con éxito el establecimiento de conexión* @param Session Parámetro opcional. Session es una sesión de conexión con un cliente, y necesita enviar datos al cliente a través de él*/ @Onopen public void Onopen (sesión de sesión) {this.session = session; WebSocketSet.add (esto); // Agregar a AddonLineCount () en SET; // Agregar 1 número de número en línea System.out.println ("¡Hay una nueva conexión para unirse! El número actual de personas en línea es" + getOnlineCount ()); } / *** Método para conectar las llamadas de cierre* / @Onclose public void onClose () {WebSocketSet.remove (this); // Eliminar Subonlinecount () de Set; // Eliminar el número en línea por 1 número en línea System.out.println ("¡Hay una conexión cerrada! El número actual de personas en línea es" + getOnlinecount ()); } / *** Método llamado después de recibir el mensaje del cliente* @param Mensaje El mensaje enviado por el cliente* @param Session Parámetro opcional* / @OnMessage public void onMessage (mensaje de cadena, sesión de sesión) {System.out.println ("Mensaje desde el cliente:" + Mensaje); // Mensaje por lotes para (WebSocketTest Elem: WebSocketSet) {try {item.sendMessage (mensaje); } catch (ioException e) {E.PrintStackTrace (); continuar; }}}} / ** * llamado cuando ocurre un error * @param session * @param error * / @onerror public void onError (sesión de sesión, error de lanzamiento) {System.out.println ("Error ocurrió"); Error.printStackTrace (); } /*** Este método es diferente de los métodos anteriores. No hay anotación, es un método agregado de acuerdo con sus necesidades. * @param mensaje * @throws ioexception */ public void sendMessage (mensaje de cadena) lanza ioexception {this.session.getBasicRemote (). SendText (mensaje); //this.session.getasyncremote().sendText(message); } public static sincronizado int getOnlinecount () {return onLineCount; } public static sincronizado void addonlineCount () {WebSockettest.onlinecount ++; } public static sincronizado void subonlinecount () {WebSockettest.onlinecount--; }}Abra dos navegadores, ingrese a la URL y ejecutarlo directamente
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.