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.
El protocolo HTTP tradicional es apátrico. 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.
** Junto 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, y utiliza WebSocket para implementar una sala de chat.
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 también debe ejecutarse en Tomcat7.0.27 o superior.
Código de servidor de WebSocket
// Esta anotación se utiliza para especificar un URI, a través del cual el cliente puede conectarse al WebSocket. Mapeo de anotación similar a servlet. No es necesario configurarlo en Web.xml. @ServerEndpoint ("/WebSocket") public Class WebSocketDemo {// Variable estática utilizada para registrar el número actual de conexiones en línea. Debe estar diseñado para ser seguro de hilo. Private static final AtomicInteger onLineCount = new AtomicInteger (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 estático privado CopyOnwriteArraySet <ScocketDemo> WebSocketSet = new CopyOnwriteArySet <ScOBSOCKDEMO> (); // Defina un apodo de chat que registra el apodo de cadena final privada del cliente; // Conecte una sesión de conexión con cierto cliente, y debe enviar datos a la sesión de sesión privada del cliente; public WebSocketDemo () {Nickname = "invitado" + onlineCount.getAndIncrement (); } / * * Use la anotación @Onopen para indicar la devolución después de que el enlace del cliente sea exitoso. La sesión de parámetros es el parámetro opcional Esta sesión es una sesión en la especificación WebSocket, que representa una sesión. No httpsession */ @Onopen public void Onopen (sesión de sesión) {this.session = session; WebSocketSet.add (esto); String Message = String.Format ("[%s,%s]", apodo, "agregar a la sala de chat"); transmisión (mensaje); System.out.println ("onopen"); }/ * * Use la anotación @OnMessage para indicar cuándo el cliente envía un mensaje y el primer parámetro indica los datos enviados por el usuario. La sesión de parámetros es un parámetro opcional, que es consistente con la sesión en el método Onopen */@onmessage public void onMessage (mensaje de cadena, sesión de sesión) {// Por supuesto verdadero system.out.println (this.session == Session); Broadcast (String.format ("%s:%s", apodo, filtro (mensaje))); }/ ** devolución de llamada Después de que el usuario rompe el enlace, tenga en cuenta que este método debe llamarse después de que el cliente llama al método de enlace roto*/ @Onclose public void onClose () {WebSocketSet.remove (esto); String Message = String.Format ("[%s,%s]", apodo, "Deja el enlace de la sala de chat"); transmisión (mensaje); } // Complete masa de masa envía privada void transmisión (info de cadena) {for (WebSocketDemo W: WebSocketSet) {try {synChronized (WebSocketDemo.Class) {w.session.getBasicRemote (). SendText (info); }} Catch (ioException e) {System.out.println ("Enviar mensaje al cliente"+w.nickname+"No se pudo enviar el mensaje"); WebSocketSet.remove (W); intente {w.session.close (); } catch (ioException e1) {} string Message = String.Format ("[%s,%s]", w.nickname, "desconectado"); transmisión (mensaje); }}} // puede hacer algunas solicitudes de filtrado para mensajes de usuario, como palabras clave de bloqueo, etc. . Public static String Filter (String Message) {if (Message == NULL) {return null; } Mensaje de retorno; }}Código del cliente (página de inicio web):
<! DocType html> <html> <head> <meta charset = "utf-8"> <title> Inserte el título aquí </title> <script type = "text/javascript"> var ws = new WebSocket ("ws: // localhost: 8080/webockettest/webSocket"); / * * Escuche los cambios en los tres estados. JS llamará a la devolución de llamada*/ ws.onopen = function (mensaje) {}; ws.onclose = function (mensaje) {}; ws.onmessage = function (mensaje) {showMessage (message.data); }; // 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 () {ws.close (); }; // cerrar la función de conexión CloseWebSocket () {ws.close (); } // Enviar una función de mensaje send () {var input = document.getElementById ("msg"); var text = input.Value; ws.send (texto); input.Value = ""; } function showMessage (mensaje) {var text = document.createTextNode (mensaje); var br = document.createElement ("br") var div = document.getElementById ("showChatMessage"); div.appendChild (texto); div.appendchild (BR); } </script> </head> <body> <div id = "show"> <div id = "showChatMessage"> </div> <input type = "text" size = "80" id = "msg" name = "msg" placeholder = "Ingrese contenido de chat"/> <input = "Botón" Valor = "Send" Id = "Sendbn" name = "Send" name = "Sendbn" Sendbn "" Sendbn " onClick = "send ()"> </body> </html>Como se mencionó anteriormente, se completa una sala de chat con función de chat grupal. Durante el proceso de verificación, se descubrió que el uso de WebSocket puede completar las solicitudes de dominio cruzado.
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.