WebSocket en Kotlin: creación de aplicaciones en tiempo real desde cero
Las aplicaciones web modernas requieren cada vez más la transmisión instantánea de datos entre el cliente y el servidor. El HTTP tradicional, que funciona bajo el principio de «solicitud-respuesta», no es adecuado para tareas que necesitan una comunicación bidireccional constante — chats, juegos en línea, cotizaciones bursátiles o notificaciones en tiempo real. Es aquí donde el protocolo WebSocket viene al rescate. En este artículo, analizaremos cómo crear aplicaciones en tiempo real en Kotlin utilizando WebSocket, desde la teoría básica hasta ejemplos prácticos.
Kotlin, gracias a su concisión, seguridad y compatibilidad total con el ecosistema Java, es una excelente opción para el desarrollo del lado del servidor. Como framework principal utilizaremos Ktor — un framework asíncrono moderno para Kotlin que tiene soporte integrado para WebSocket.
¿Qué es WebSocket y por qué es necesario?
WebSocket es un protocolo que proporciona una comunicación full-duplex (bidireccional) entre el cliente y el servidor a través de una única conexión TCP persistente. A diferencia de HTTP, donde el cliente siempre inicia la solicitud, WebSocket permite que el servidor envíe datos al cliente en cualquier momento.
Principales ventajas de WebSocket:
- Baja latencia: Sin gastos generales de establecer una nueva conexión para cada mensaje.
- Eficiencia: Tráfico de servicio mínimo (solo 2 bytes por mensaje después de establecer la conexión).
- Conexión persistente: El servidor puede enviar datos en tiempo real sin necesidad de sondeo por parte del cliente.
WebSocket es ideal para:
- Chats en línea y mensajería instantánea
- Edición colaborativa de documentos
- Cotizaciones bursátiles y financieras
- Juegos multijugador
- Notificaciones push y monitoreo
Configuración del proyecto Ktor para WebSocket
Antes de escribir código, es necesario configurar el proyecto. La forma más sencilla es hacerlo a través de IntelliJ IDEA con el plugin de Ktor, o manualmente mediante Gradle.
Paso 1: Creación del proyecto
Cree un nuevo proyecto Gradle con Kotlin (JVM). En el archivo build.gradle.kts agregue las siguientes dependencias:
plugins { kotlin("jvm") version "1.9.22" id("io.ktor.plugin") version "2.3.7"}
application { mainClass.set("ApplicationKt")}
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-websockets:2.3.7") implementation("ch.qos.logback:logback-classic:1.4.14")}Paso 2: Estructura básica del servidor
Creemos el archivo Application.kt y escribamos un servidor WebSocket mínimo:
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.delay
fun main() { embeddedServer(Netty, port = 8080) { install(WebSockets) webSocket("/chat") { send("¡Bienvenido al chat!") for (frame in incoming) { if (frame is Frame.Text) { val text = frame.readText() send("Has escrito: $text") println("Recibido: $text") } } } }.start(wait = true)}Este código inicia un servidor en el puerto 8080 que acepta conexiones WebSocket en la dirección /chat. Al conectarse, el cliente recibe un mensaje de bienvenida, y luego el servidor responde a cada mensaje de texto con un eco.
Creación de un chat avanzado con salas
Ahora pasemos a un ejemplo más complejo — un chat múltiple