Escenario: los datos de actualización de backend se presionan al cliente (la parte Java usa el servidor Tomcat).
Hay muchas soluciones para impulsar los datos en el backend, como encuestas, cometas y websocket.
1. La encuesta es el costo de desarrollo más bajo para el backend, lo que significa procesar las solicitudes de AJAX y devolver datos de la manera tradicional. Cuando estaba en la escuela, los proyectos de laboratorio siempre usaban encuestas porque es la más segura y fácil de implementar. Sin embargo, el desperdicio de recursos de comunicación causados por las encuestas no puede ignorarse. Independientemente de si los datos cambian o no, la solicitud se enviará y responderá como de costumbre, y cada solicitud HTTP tendrá una información de encabezado largo.
2. El concepto de cometa es una conexión larga. Después de que el cliente envía una solicitud, el backend mantiene la conexión hasta que la conexión se agotó o el backend devuelve los datos, y luego restablece la conexión, transfiriendo efectivamente los recursos de comunicación al servidor, que en realidad consume recursos del servidor.
3. WebSocket es una tecnología de comunicación dúplex duplica proporcionada por HTML5. Se da cuenta de la comunicación entre el cliente y el servidor a través del "apretón de manos". Tiene un buen rendimiento en tiempo real y una pequeña cabeza. Los navegadores actualmente compatibles son los siguientes:
La situación ideal es usar la combinación de WebSocket y Comet, y usar el método Comet para rebajar los navegadores como IE8. Pero de esta manera, el backend necesita implementar dos lógicas para el procesamiento de solicitudes, a saber, WebSocket y Comet. Por lo tanto, este artículo ha agregado Node.js. La razón para hacer esto es transferir la lógica que maneja WebSocket (o Comet) a la parte Node.js, y no "inducir problemas" al backend, porque en situaciones reales, no es fácil para los desarrolladores frontales promover desarrolladores de fondo. Node.js es la capa intermedia para la comunicación entre el navegador y la capa de lógica de negocios Java, conectando al cliente a Tomcat y comunicarse con TomCat a través de Socket (es Socket, no WebSocket, y el backend necesita implementar la interfaz de socket.
En el cliente, WebSocket y Comet se implementan a través de Socket.io. Socket.io elegirá el método de implementación apropiado (WebSocket, Long Pull ..) para diferentes versiones del navegador o diferentes clientes. La introducción de Socket.io facilita el manejo de WebSocket (o una conexión larga). Socket.io
El cliente presenta Socket.io:
<script src = "static/js/socket.io.js"> </script>
Código JavaScript del cliente:
var Socket = io.connect ('127.0.0.1:8181'); // Enviar datos al servidor Socket.emit ('fromWebClient', jSondata); // Recibir datos del servidor Socket.on ('PushToWebClient', function (data) {// do sth.});Código del servidor node.js:
var http = require ('http'), app = http.createServer (). Listen ('8181'), io = require ('Socket.io'). Listen (App); io.sockets.on ('Connection', function (Socketio) {// Recibe datos del cliente Socketio.on Socketio.emit ('PushTowebClient', JSondata);Establecer una buena conexión entre el cliente y el servidor Node.js es solo el primer paso. Lo siguiente también requiere establecer una conexión entre el servidor Node.js y la capa de lógica de negocios Java. En este momento, el servidor Node.js sirve como cliente para enviar una solicitud de conexión TCP a TOMCAT. Después de que la conexión es exitosa, el servidor Node.js y Tomcat establecen un canal dúplex completo, y es el único. No importa cuántas solicitudes de clientes sean, se reenvían desde el servidor Node.js a Tomcat; Del mismo modo, los datos presionados por TomCat también se distribuyen a cada cliente a través del servidor Node.js.
Aquí hay un problema, es decir, después de establecer las conexiones de WebSocket y las conexiones de socket, las dos conexiones están bloqueadas. Tomcat no sabe qué conexión WebSocket envió los datos, ni sabe qué cliente envió los datos. Por supuesto, Node.js puede usar la ID de sesión para enviar a Tomcat para identificar qué cliente es, pero este artículo usa otro método.
Cuando un cliente establece una conexión WebSocket con Node.js, cada conexión contendrá una instancia, que se llama Socketio aquí. Cada Socketio tiene un atributo de ID para identificar de manera única esta conexión, que se llama Socket_ID aquí. Usando Socket_ID, se establece una tabla de mapeo en el servidor Node.js para almacenar la relación de mapeo entre cada Socketio y Socket_ID. Cuando el servidor Node.js envía datos a TomCat, el Socket_ID se trae consigo, y luego la parte Java lleva a cabo una serie de procesamiento, luego encapsula los diferentes datos requeridos por cada cliente y lo devuelve. Los datos devueltos deben tener una relación correspondiente con Socket_ID. De esta manera, cuando el servidor Node.js recibe los datos enviados por TomCat, diferentes Socketio los distribuyen a diferentes clientes a través de la tabla de mapeo mencionada anteriormente.
Código del servidor node.js:
var http = require ('http'), net = require ('net'), app = http.createServer (). Listen ('8181'), io = require ('Socket.io'). Listen (App), Nodeserver = new Net.socket (); // Conéctese a TomCat Nodeserver.connect (8007, '127.0.0.1', function () {console.log ('Connected');}); // Almacene la instancia de conexión de WebSocket del cliente varsockE = {}; // Cree una conexión con el cliente io.sockets.on ('conexión', function (Socketio) {// Recibir datos del cliente y enviarlo a TomCat Socketio.on ('FromWebClient', function (WebClientData) {// almacenar a la tabla de mapeo ASCOKET [Socketio.id] = ShoCketio; // Agregar a Socket_id a los datos sentados a TomCat Sid 'sid'] Socketio.id; / Enviar datos del tipo de cadena a TomCat Nodeserver }); // Recibe datos de TomCat Nodeserver.On ('Data', Function (Data) {var jsondata = json.parse (data.ToString ()); // distribuye datos al cliente para (var i en jsondata.list) {asocket [jsondata.list [i] ['sid']. Emit ('pushTowebclient', jsondata. }});El código anterior omite alguna lógica, como los datos recibidos por el servidor Node.js de Tomcat se divide en dos tipos, uno es los datos presionados y el otro es que los datos respondan a la solicitud. Aquí, los datos presionados se procesan uniformemente.
Al procesar la comunicación, los datos enviados por Node.js a TomCat están en formato de cadena, y los datos recibidos de TomCat son un objeto de búfer (ocho bytes), que debe convertirse en cadena y luego convertirse en JSON y enviar al cliente.
Este artículo solo ofrece un ejemplo simple de tales dos conexiones, y muchas cosas deben agregarse al negocio específico. Dado que Node.js se introduce en el proyecto, el front-end debe emprender más cosas, como procesamiento, almacenamiento en caché e incluso agregar mucha lógica comercial.