-
- Primero ejecutar la aplicacion springboot.
-
- Luego Ejecutar la pagina estatica en el navegador y duplicar la pagina, para simular el chat, utilizando el puerto:
- Introducción
- Arquitectura del Sistema
- Componentes Principales
- Configuración
- Endpoints
- Flujo de Mensajes
- Frontend
- Requisitos
- Instalación y Ejecución
Este sistema implementa un servicio de mensajería en tiempo real utilizando WebSockets con Spring Boot. Proporciona funcionalidades para:
- Envío de mensajes públicos a todos los usuarios conectados
- Envío de mensajes privados a usuarios específicos
- Notificaciones globales y privadas
- Identificación única de clientes
El sistema sigue una arquitectura cliente-servidor con los siguientes elementos clave:
- Cliente: Navegador web con JavaScript
- Servidor: Aplicación Spring Boot
- Protocolo: STOMP sobre WebSockets
- Transporte: SockJS como fallback
Maneja el proceso de conexión inicial (handshake) asignando un ID único a cada cliente.
Responsabilidades:
- Generar identificadores únicos para clientes
- Registrar información de conexión
- Establecer el Principal para la sesión
Configuración central para WebSockets y STOMP.
Configuraciones:
- Habilita broker de mensajes simple
- Define prefijos para destinos
- Registra endpoint WebSocket con soporte para SockJS
Maneja los mensajes entrantes a través de WebSockets.
Métodos:
getMessage: Procesa mensajes públicosgetPrivateMessage: Procesa mensajes privados
Servicio para enviar mensajes desde el servidor.
Métodos:
sendMessage: Mensaje públicosendPrivateMessage: Mensaje privadosendNotification: Notificación globalsendPrivateNotification: Notificación privada
Controlador REST para enviar mensajes desde HTTP.
Endpoints:
- POST
/send-message - POST
/send-private-message/{id} - POST
/send-notification-global - POST
/send-notification-private/{id}
@Configuration
@EnableWebSocketMessageBroker
public class WSConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/receive");
registry.setApplicationDestinationPrefixes("/ws");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket")
.setHandshakeHandler(new ClientHandshakeHandler())
.withSockJS();
}
}- Broker: Simple en memoria con prefijo
/receive - Destinos de aplicación: Prefijo
/ws - Endpoint principal:
/websocketcon soporte SockJS
| Destino | Tipo | Descripción |
|---|---|---|
/ws/message |
Mensaje | Enviar mensaje público |
/ws/private-message |
Mensaje | Enviar mensaje privado |
/receive/message |
Suscripción | Recibir mensajes públicos |
/user/receive/private-message |
Suscripción | Recibir mensajes privados |
/receive/global-notification |
Suscripción | Recibir notificaciones globales |
/user/receive/private-notification |
Suscripción | Recibir notificaciones privadas |
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /send-message |
Enviar mensaje público |
| POST | /send-private-message/{id} |
Enviar mensaje privado |
| POST | /send-notification-global |
Enviar notificación global |
| POST | /send-notification-private/{id} |
Enviar notificación privada |
- Cliente envía mensaje a
/ws/message - Servidor procesa en
MessageController.getMessage - Servidor envía a todos los suscritos a
/receive/message
- Cliente envía mensaje a
/ws/private-message - Servidor procesa en
MessageController.getPrivateMessage - Servidor envía solo al usuario destino en
/user/receive/private-message
- Cliente HTTP llama a endpoint REST (ej.
/send-notification-global) WSControllerdelega aWSServiceWSServiceusaSimpMessagingTemplatepara enviar a suscriptores
- Interfaz: Formularios para mensajes públicos/privados
- Historial: Tabla que muestra mensajes recibidos
- Notificaciones: Contador visual de notificaciones no leídas
connect(): Establece conexión WebSocketsendMessage(): Envía mensaje públicosendPrivateMessage(): Envía mensaje privadoshowMessage(): Muestra mensaje en la tablaupdateNotificationDisplay(): Actualiza contador de notificaciones
- Java 8+
- Spring Boot 2.x
- SockJS
- STOMP
- jQuery (frontend)
- Bootstrap (frontend)
<!-- Ejemplo de dependencias -->
plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.pardhu'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '15'
repositories {
mavenCentral()
}
dependencies {
// SpringDoc OpenAPI (Documentación automática + Swagger UI)
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0") // Usa la última versión
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.webjars:webjars-locator-core'
implementation 'org.webjars:sockjs-client:1.0.2'
implementation 'org.webjars:stomp-websocket:2.3.3'
implementation 'org.webjars:bootstrap:3.3.7'
implementation 'org.webjars:jquery:3.1.1-1'
testCompileOnly 'org.projectlombok:lombok:1.18.20'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
}
tasks.named('test') {
useJUnitPlatform()
}
- Clonar repositorio
- Configurar dependencias (Maven/Gradle)
- Ejecutar aplicación Spring Boot:
mvn spring-boot:run
- Acceder a
http://localhost:8080en navegador
stompClient.send("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/ws/message", {},
JSON.stringify({'messageContent': 'Hola a todos!'}));stompClient.send("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/ws/private-message", {},
JSON.stringify({'messageContent': 'Hola en privado!'}));curl -X POST -H "Content-Type: application/json" -d '{"messageContent":"Nueva notificación"}' http://localhost:8080/send-notification-global- Persistencia: Los mensajes no se persisten, solo se envían a clientes conectados
- Escalabilidad: El broker simple en memoria no es adecuado para múltiples instancias
- Seguridad: No hay autenticación implementada en este ejemplo básico
- Implementar autenticación y autorización
- Añadir persistencia de mensajes
- Configurar broker externo (RabbitMQ, ActiveMQ) para escalabilidad
- Añadir soporte para salas/chat grupal
- Implementar historial de mensajes



