Práctica de SSE (eventos enviados por el servidor)
HTTP es un protocolo de solicitud-respuesta en el modelo informático cliente-servidor. Para iniciar un intercambio, el cliente envía una solicitud al servidor. Para completar el intercambio, el servidor devuelve una respuesta al cliente. El servidor sólo puede enviar una respuesta (respuesta a la solicitud) a un cliente. En el protocolo HTTP, el cliente es el iniciador del intercambio de mensajes.
Server-Sent Events (SSE) es una tecnología sencilla que permite la comunicación asíncrona de servidor a cliente para una aplicación web específica.
Existe una variedad de técnicas que permiten a los clientes recibir mensajes sobre actualizaciones asincrónicas desde el servidor. Se pueden dividir en dos tipos: extracción de cliente y inserción de servidor.
En la tecnología pull del lado del cliente, el cliente solicita periódicamente actualizaciones del servidor. El servidor puede responder con una actualización o una respuesta especial que aún no ha sido actualizada. Hay dos tipos de extracción de clientes: sondeo corto y sondeo largo.
El cliente envía periódicamente solicitudes al servidor. Si el servidor tiene una actualización, enviará una respuesta al cliente y cerrará la conexión. Si el servidor no se actualiza, también envía una respuesta al cliente y cierra la conexión.
El cliente envía una solicitud al servidor. Si el servidor tiene una actualización, envía una respuesta al cliente y cierra la conexión. Si el servidor no tiene actualizaciones, permanecerá conectado hasta que haya una actualización. Cuando hay actualizaciones disponibles, el servidor envía una respuesta al cliente y cierra la conexión. Si las actualizaciones no están disponibles dentro de un tiempo de espera determinado, el servidor enviará una respuesta al cliente y cerrará la conexión.
En la tecnología de inserción de servidor, el servidor envía mensajes activamente al cliente una vez que el mensaje está disponible. Hay dos tipos de inserción de servidor: SSE y WebSocket.
SSE es una tecnología para enviar mensajes de texto sin formato desde un servidor a un cliente en una aplicación web basada en navegador. SSE se basa en conexiones persistentes en el protocolo HTTP, un protocolo de red estandarizado por el W3C y la interfaz de cliente EventSource que forma parte del conjunto de estándares HTML5. SSE se basa en conexiones persistentes en el protocolo HTTP, y su protocolo de red y la interfaz del cliente EventSource han sido estandarizados por el W3C y pasan a formar parte del conjunto de estándares HTML5.
WebSocket es una tecnología que permite la comunicación síncrona, bidireccional y en tiempo real en aplicaciones web. WebSocket se basa en un protocolo distinto de HTTP (TCP) y puede requerir una infraestructura de red adicional (servidor proxy, NAT, firewall, etc.).
El cliente realiza una solicitud a través del protocolo Http, que se actualiza al protocolo WebSocket durante la fase de protocolo de enlace.
En el campo de datos, el servidor puede enviar datos del evento.
El servidor puede enviar un identificador de evento único (campo de identificación). Si se interrumpe la conexión, el cliente se volverá a conectar automáticamente y enviará el último ID de evento recibido y el encabezado Last-Event-ID.
En el campo Reintentar, el servidor puede enviar un tiempo de espera (en milisegundos) después del cual el cliente se volverá a conectar automáticamente si se interrumpe la conexión. Si no se especifica este campo, el valor estándar debe ser 3000 milisegundos.
Si una línea comienza con el carácter de dos puntos:, el cliente debe ignorarlo. Esto se puede utilizar para enviar comentarios desde el servidor o para evitar que ciertos servidores proxy cierren conexiones debido a tiempos de espera.
Para abrir una conexión, cree un objeto EventSource.
Aunque el propósito de SSE es enviar eventos desde el servidor al cliente, también puede utilizar parámetros de consulta GET para pasar datos del cliente al servidor.
Para cerrar la conexión, llame al método close().
Hay un atributo readyState que indica el estado de la conexión:
El cliente recibe mensajes y los procesa utilizando el método onmessage
SSE es compatible con la mayoría navegadores:
Spring Web MVC Framework 5.2.0 se basa en la API Servlet 3.1 e implementa aplicaciones asincrónicas a través de grupos de subprocesos. Por lo tanto, la aplicación se puede utilizar en contenedores Servlet 3.1 como Tomcat 8.5 y Jetty 9.3.
Envío de eventos usando Spring MVC:
Ejemplo:
En este ejemplo, el servidor envía un flujo de eventos periódico de corta duración (un flujo limitado de palabras) hasta completar la palabra.
Ejemplo:
Efecto de ejecución:
Ejemplo de cliente (words.html):
Efecto de ejecución:
<. p> En este ejemplo, el servidor envía un flujo continuo de eventos periódicos cada segundo, un flujo potencialmente ilimitado de información sobre el rendimiento del servidor:Vista previa del efecto (salida una vez por segundo):
Aperiódico significa que no hay un período de tiempo fijo y puede ser desencadenado por otros factores en cualquier momento específico. El siguiente ejemplo simula los factores desencadenantes a través de eventos primaverales.
Efecto:
Simular operación de activación: llamar a http://localhost:8080/sse/mvc/trigger?eventType=customer
El cliente recibe datos:
Spring Web Flux Framework 5.2.0 se basa en la API Reactive Streams y utiliza el modelo de cálculo de bucle de eventos para implementar aplicaciones Java asincrónicas. Estas aplicaciones se ejecutan en servidores de red sin bloqueo, como Netty 4.1 y Undertow 1.4, y en contenedores Servlet 3.1, como Tomcat 8.5 y Jetty 9.3.
Uso del marco Spring Web Flux para enviar eventos:
Ejemplo simple:
Al igual que el ejemplo anterior de Spring MVC, generamos datos una vez por segundo, como se muestra a continuación:
Resultado:
En contraste con la implementación de spring mvc, utilizamos la implementación flux, como se muestra a continuación:
El resultado es el mismo que la implementación de Spring MVC anterior. p>
El efecto es el mismo que el anterior. Se puede ver que la API reactiva es muy simple.
El efecto es el mismo que el anterior.