1. Una breve introducción a WebSocket
WebSocket Protocol es un nuevo protocolo para HTML5. Implementa la comunicación duplex full-duplex entre el navegador y el servidor. El apretón de manos inicial requiere la ayuda de las solicitudes HTTP para completar el apretón de manos.
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.
Fondo de websocket
Solo se puede lograr una comunicación unidireccional a través de HTTP en el navegador. Comet puede simular la comunicación bidireccional hasta cierto punto, pero es de baja eficiencia y requiere un buen soporte del servidor; Socket y XMLSocket en Flash pueden realizar una verdadera comunicación bidireccional, y estas dos funciones se pueden usar en JavaScript a través del puente Flex Ajax. Se puede previsir que si WebSocket se implementa en el navegador, reemplazará las dos tecnologías anteriores y se utilizará ampliamente. Ante esta situación, HTML5 define el protocolo WebSocket, que puede guardar mejor los recursos del servidor y el ancho de banda y lograr la comunicación en tiempo real.
El protocolo WebSocket también se implementa en Javaee7.
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.
2. Ejemplo de WebSocket
2.1. Cree un nuevo proyecto de prueba de Javaweb
Agregar dependencia del paquete jar en pom.xml
<Spendency> <MoupRoD> Javax </groupid> <artifactId> javaee-api </artifactid> <versión>. </versión> <cope> proporcionó </cope> </pendency>
Código del cliente (página de inicio web):
< %@ page lenguaje = "java" pageCoding = "utf-" %> <! DocType html> <html> <fead> <title> Tomcat Implementación de Java Backend WebSocket </title> </toad> <body> Welcome <br/> <input id = "Text" Type = "Text"/> <Bootin OnClick = "Enviar ()" Send un mensaje </Button <hr/"Hr/Button" onClick = "CloseWebSocket ()"> Cerrar WebSocket Conexión </boton> <hr/> <div id = "mensaje"> </div> </body> <script type = "text/javascript"> var websocket = null; // determinar si el navegador actual es compatible El navegador no es compatible con WebSocket ')} // Método de devolución de llamada para errores en conexión webSocket.Onerror = function () {setMessageInnerHtml ("Errores de conexión de WebSocket en WebSocket");}; // Método de devolución de llamada para una conexión exitosa WebSocket.OnOpen = function () {setMessageInnerhtml ("WebSocket Connection Efective exitoso");} // Método Callback para recibir el método de Callback para recibir el Método de Callback. (Event) {setMessageInnerHtml (event.data);} // Conexión Método de devolución de llamada cerrada 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.onbeforeNoNLOAD = function () {CloseWebSocket ();} // Muestra el mensaje en la función de la página web setMessageInnerHtml (innerHtml) {document.getElementById ('Message'). InnerHTML + = InnerHtml + '' <BR/> ';} // Close Websocket Function CloseWebSocket () {) {) function send () {var Message = document.getElementById ('Text'). Value; WebSocket.send (Mensaje);} </script> </html> Código de backend web Java
paquete me.gacl.websocket; import java.io.ioexception; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.*; import javax.websocket.server.serverendpoint;/*** @serverendpoint La anotación 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 la anotación se utilizará para escuchar la conexión del usuario con la dirección de URL del acceso terminal del usuario. El cliente puede conectarse al lado del servidor de WebSocket a través de esta URL*/@serverEndpoint ("/WebSocket") Public Class WebSockettest {// Variables estáticas utilizadas para registrar el número actual de conexiones en línea. Debe estar diseñado para ser seguro de hilo. Private static int onlineCount =; // 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 estático privado CopyOnwriteArraySet <WebSockettest> WebSocketSet = New CopyOnwriteArraySet <WebSockettest> (); // La sesión de conexión de conexión con el cliente se debe enviar al cliente a través del cliente a través del cliente privado;/*** Session es una sesión de conexión con un determinado cliente, y necesita enviar datos al cliente a través de él*/@ontoopenpublic void onopen (sesión de sesión) {this.session = session; webSocketSet.add (this); // Agregar a AddonLineCount () en SET; // Agregar a 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 la llamada de cierre*/@onClosePublic void onClose () {WebsocketSet.remove (esto); // Eliminar Subonlinecount () de Set; // disminución del 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 del mensaje enviado por el cliente* @param Session Opcional Parameter*/ @OnMessagePpublic Public OnMessage (String Mensaje Session Session) {Sistema. message);//Batch message for(WebSocketTest item: webSocketSet){try {item.sendMessage(message);} catch (IOException e) {e.printStackTrace();continue;}}}/*** Called when an error occurs * @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {System.out.println ("Error ocurrido"); 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 (string Message) lanza ioexception {this.session.getBasicRemote (). SendText (mensaje); // this.session.getasyncremote (). SendText (Message);} public synchonized int getonlinEnlinEd () {return onlinecount;} addOnlinecount () {WebSocketTest.Onlinecount ++;} public static sincronizado void subonlineCount () {WebSocketTest.onlinecount--;}} 1.2. Efecto de operación
Abra el navegador Google y el navegador Firefox al mismo tiempo para las pruebas de simulación de múltiples clientes. El efecto de operación es el siguiente:
El contenido anterior es el tutorial de ejemplo para implementar WebSocket por Java Backend Tomcat presentada a usted. ¡Espero que sea útil para todos!