Cada día tenemos una mayor necesidad de utilizar las características que tiene HTML5 en nuestras aplicaciones. Pero quizá si hay una que destaca por encima de todas es el uso de los WebSockets. Java WebSockets es una de las especificaciones de Java EE 7 y vamos a introducirla en este artículo.
¿Que es un WebSocket?
Es una conexión bidireccional punto a punto entre un navegador y su servidor, de tal manera que ambas partes se puedan enviar mensajes. Para la parte del cliente no resulta ninguna innovación pero para la parte del servidor sí ya que permite enviar información al cliente sin obligar a este a realizar peticiones AJAX cada x segundos.
Java WebSockets
En Java, los WebSockets vienen como estandar a partir de Java EE 7 en la especificación JSR 356. Aunque hay varios servidores que lo implementan en versiones anteriores ya sea cumpliendo el standard o ya sea a traves de una implementación propietaria. Yo en este caso utilizaré un Tomcat 8 que cumple con la especificación y podré utilizar las anotaciones estandard para crear de una forma sencilla un WebSocket.
Java WebSockets HolaMundo
Vamos a construir el ejemplo de HolaMundo para ello nos vamos a apoyar en dos anotaciones:
@ServerEndPoint : Define el punto de acceso al WebSocket en nuestro caso será @ServerEndPoint(“/mensaje”) que nos define la ruta /mensaje como punto de acceso.
@OnMessage : Se encarga de definir el método del servidor que se ejecutará cuando llegue un mensaje desde el cliente via WebSocket . Vamos a ver ambas anotaciones en código.
package com.arquitecturajava; import javax.websocket.OnMessage; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/mensaje") public class MiWebSocket { @OnMessage public String mensaje(String mensaje) { return "hola desde el servidor el mensaje es :" +mensaje; } }
Java WebSocket Cliente
Podemos ver que el código es realmente sencillo .Nos falta por ver como construimos una página de cliente que se conecte a este WebSocket.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script type="text/javascript" src="jquery-1.11.0.js"> </script> <script type="text/javascript"> $(document).ready(function() { var uriWS="ws://localhost:8080/WebSocketHolaMundo/mensaje"; var miWebsocket= new WebSocket(uriWS); console.log (miWebsocket); miWebsocket.onopen=function(evento) { console.log("abierto"); miWebsocket.send("hola"); } miWebsocket.onmessage=function(evento) { console.log(evento.data); } }); </script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> </body> </html>
Hemos usado el api de Javascript perteneciente a HTML 5 para la construcción de un Cliente de WebSocket . Ojo este caso es muy similar a los casos clásicos de AJAX y existe una sintaxis concreta para cada tipo de navegador (Chrome,Safari,Firefox) . En nuestro caso nos hemos centrado en Chrome. Hemos creado un WebSocket para él y le hemos solicitado que abra la conexión enviando un mensaje a través del método send(). Realizada esta operación el servidor recibirá el mensaje en su método @OnMessage y nos volverá a enviar una respuesta . Esta respuesta será capturada por el método onmessage del cliente e imprimida por la consola.
La consola nos mostrará un resultado como el siguiente :
Hemos terminado de construir nuestro WebSocket
Hola Me interesaria mas profundizar sobre este y otros temas de arquitectura en JAVA ojala me puedas enviarme actualizaciones
echa un vistazo al blog . Si quieres profundizar tienes algunos cursos gratuitos , como el de introducción a JPA o Spring WebFlux y luego los cursos de pago 🙂
Buenas, esta api soporta enviar mensajes grandes, ya sean archivos de gigabytes o streaming de video.. tengo una aplicacion que debe guardar estos archivos en una USB que es detectada por un jar y establece comunicacion con una pagina por websocket pero con archivos miu grandes falla
no lo he probado ya lo siento 🙁
Excelente, el ejemplo que das es de No-blocking y asíncrono? Como Netty. Gracias.
No en este caso no lo es son websockets normales
Hola Cecilio, muchas gracias por tus tutoriales. Tengo una consulta. ¿Qué framework o librería java puedo usar para que se actualice automaticámente una tabla html cada vez que hay un cambio/adición de registros en la base de datos(MySql).
Saludos.
Steve.
Hay bastantes formas de hacerlo , pero cada una tendrá sus peros. Podrías hacer una petición ajax cada x tiempo. Podrías tener un web socket que lance un mensaje cada vez que se realiza una inserción. Eso lo podrías controlar a traves de Spring frawework o de JPA entity Listeners . No hay una única solución
Hola te felicito por el tutorial. Me funcionó perfecto. Envío el mensaje y la respuesta vuelve inmediatamente.
Estoy usando spring 4 y necesito hacer inyecciones en el @ServerEndpoint. No se por qué, pero no me deja realiazar ningún tipo de inyección.
Probé con agregar la etiqueta @Controller, también con @Component pero no funciona.
Alguna idea?
Saludos
recuerda que tienes que instanciar usando un contexto de Spring de uso de anotaciones
Con tomcat 7 no funciona?
creo recordar que sí pero no a través de la implentación del standard
Hola, estoy intentando realizar el ejemplo que has explicado, pero por simple que sea, no consigo hacerlo funcionar. He probado a ejecutarlo (creándolo en eclipse como proyecto web dinámico) en tomcat 7.0.55 y 8, y con los jdk de java 7 y 8 también, pero no hay manera de conseguir acceder al websocket. Siempre me da error 404, por ejemplo en Chrome es “Error during WebSocket handshake: Unexpected response code: 404”.
Te agradecería mucho que me ayudaras, porque me estoy volviendo loco buscando la solución.
Tiene q ser con tomcat 8 revisa q el tomcat y la aplicación arrancan bien y la ruta es correcta.Crea un servlet normal para probar
Para lo que pide Jesús Anton yo he usado Apache Camel que tiene endpoints que implementan websockets y spring
Gracias por el aporte
[…] el artículo anterior de introducción a WebSocket vimos como construir un WebSocket sencillo con Java y como cada navegador se convertía en un […]
Aunque ya te he dado las gracias por linkedin, hay un tema que tengo que revisar al respecto de los websockets, y es un tema tan importante como la gestión de sesiones en servidores JEE clusterizados, y como se comporta el failover y demás.
Para casos tipicos SOA stateless es perfecto.
A ver si tengo un rato y hago un poco de i+d con esto, que me llama la atención para algunos proyectos que estoy realizando.
Saludos y muy buen articulo 🙂
Gracias 🙂
Gracias de nuevo! Excelente 🙂
me alegro que te fuera útil 🙂
Hola, buenas tardes.
Sigo el blog desde hace un tiempo, y me parece un recurso formativo de categoría.
En esta entrada se explica muy bien cómo crear un web socket, pero la funcionalidad explicada es exactamente la que tendría con long-polling, porque la petición la tiene que iniciar el cliente, limitación que los web socket nacieron para eliminar.
¿Podría escribir una entrada para explicar cómo se puede iniciar la transmisión desde el server, sin petición (mensaje) previo del cliente?
Gracias por el blog y su contenido.
Muchas gracias Jesús. Me apunto la idea que me parece interesante para abordarla:)
Saludos, escribo por agradecer el aporte de esta entrada y a la vez averiguar si se realizo una respondiendo a la petición de Jesús A., o algún enlace que me permita idealizarlo. Gracias nuevamente.
La conexión tiene que comenzar desde el cliente luego ya el servidor puede mantenerla