Biblioteca WebSocket Kotlin: Ktor WebSocket
WebSocket é um protocolo que fornece uma conexão bidirecional contínua entre cliente e servidor. No ecossistema Kotlin, uma das bibliotecas mais poderosas e populares para trabalhar com WebSocket é o Ktor — um framework assíncrono criado pela JetBrains. O Ktor oferece suporte completo ao WebSocket tanto no lado do servidor quanto no lado do cliente, permitindo criar facilmente aplicações em tempo real: chats, notificações, jogos online, rastreadores de dados e muito mais.
Neste artigo, vamos detalhar como usar WebSocket em Kotlin com Ktor. Você aprenderá a configurar dependências, criar um servidor e cliente WebSocket, enviar e receber mensagens, além de tratar erros e fechamento de conexão.
Instalação e configuração
Para começar, adicione as dependências necessárias no arquivo build.gradle.kts (ou build.gradle). Se você usa Gradle, inclua os seguintes módulos:
// build.gradle.ktsdependencies { // Parte do 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 do 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 artefatos semelhantes. Todos os módulos do Ktor versão 2.x.x suportam Kotlin Coroutines e funcionam em JVM, Android, iOS e outras plataformas.
Criação de um servidor WebSocket com Ktor
Vamos escrever um servidor echo simples, que recebe mensagens do cliente e as envia de volta. O servidor escutará na porta 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("Bem-vindo ao chat!") for (frame in incoming) { if (frame is Frame.Text) { val text = frame.readText() println("Recebido: $text") send("Echo: $text") } } } } }.start(wait = true)}Neste exemplo:
install(WebSockets)— instala o plugin WebSocket no servidor.webSocket("/chat")— define o endpoint para conexão.send()— envia uma mensagem ao cliente.incoming— canal pelo qual os frames chegam do cliente.- Os frames podem ser de texto (
Frame.Text), binários (Frame.Binary) ou de controle.
Criação de um cliente WebSocket com Ktor
Agora vamos escrever um cliente que se conecta ao nosso servidor, envia uma saudação e lê as respostas.
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") { // Lê a saudação val welcome = incoming.receive() as Frame.Text println("Servidor: ${welcome.readText()}")
// Envia uma mensagem send(Frame.Text("Olá, servidor!"))
// Aguarda a resposta echo val response = incoming.receive() as Frame.Text println("Servidor: ${response.readText()}")
// Fecha a conexão close() }
client.close()}O cliente usa dois
Também na biblioteca
Event Bus e padrão Observer em Swift (iOS/macOS)
Melhores bibliotecas de logging para Go (Golang): visão geral e comparação
JsonWebToken para JavaScript (Node.js): guia completo com exemplos