Biblioteca WebSocket Kotlin: Ktor WebSocket
WebSocket es un protocolo que proporciona una conexión bidireccional permanente entre el cliente y el servidor. En el ecosistema de Kotlin, una de las bibliotecas más potentes y populares para trabajar con WebSocket es Ktor, un framework asíncrono creado por JetBrains. Ktor ofrece soporte completo para WebSocket tanto del lado del servidor como del lado del cliente, permitiendo crear fácilmente aplicaciones en tiempo real: chats, notificaciones, juegos en línea, rastreadores de datos y mucho más.
En este artículo, analizaremos en detalle cómo usar WebSocket en Kotlin con Ktor. Aprenderá a configurar dependencias, crear un servidor y cliente WebSocket, enviar y recibir mensajes, así como manejar errores y el cierre de la conexión.
Instalación y configuración
Para comenzar, agregue las dependencias necesarias en el archivo build.gradle.kts (o build.gradle). Si usa Gradle, incluya los siguientes módulos:
// build.gradle.ktsdependencies { // Parte del servidor implementation("io.ktor:ktor-server-core:2.3.0") implementation("io.ktor:ktor-server-netty:2.3.0") implementation("io.ktor:ktor-server-websockets:2.3.0")
// Parte del cliente implementation("io.ktor:ktor-client-core:2.3.0") implementation("io.ktor:ktor-client-cio:2.3.0") implementation("io.ktor:ktor-client-websockets:2.3.0")}Para Maven, use artefactos similares. Todos los módulos de Ktor versión 2.x.x admiten Kotlin Coroutines y funcionan en JVM, Android, iOS y otras plataformas.
Creación de un servidor WebSocket con Ktor
Escribamos un servidor echo simple que reciba mensajes del cliente y los devuelva. El servidor escuchará en el puerto 8080.
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.*
fun main() { embeddedServer(Netty, port = 8080) { install(WebSockets) routing { webSocket("/chat") { send("¡Bienvenido al chat!") for (frame in incoming) { if (frame is Frame.Text) { val text = frame.readText() println("Recibido: $text") send("Echo: $text") } } } } }.start(wait = true)}En este ejemplo:
install(WebSockets)— conecta el plugin WebSocket al servidor.webSocket("/chat")— define el endpoint para la conexión.send()— envía un mensaje al cliente.incoming— canal por el que llegan los frames del cliente.- Los frames pueden ser de texto (
Frame.Text), binarios (Frame.Binary) o de control.
Creación de un cliente WebSocket con Ktor
Ahora escribamos un cliente que se conecte a nuestro servidor, envíe un saludo y lea las respuestas.
import io.ktor.client.*import io.ktor.client.engine.cio.*import io.ktor.client.plugins.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.*
suspend fun main() { val client = HttpClient(CIO) { install(WebSockets) }
client.webSocket("ws://localhost:8080/chat") { // Leemos el saludo val welcome = incoming.receive() as Frame.Text println("Servidor: ${welcome.readText()}")
// Enviamos un mensaje send(Frame.Text("¡Hola, servidor!"))
// Esperamos la respuesta echo val response = incoming.receive() as Frame.Text println("Servidor: ${response.readText()}")
// Cerramos la conexión close() }
client.close()}El cliente usa d