WebSockets em Kotlin: da teoria à magia em tempo real
Imagine que você abriu um mensageiro, enviou uma mensagem — e ela apareceu instantaneamente para o interlocutor. Sem recarregar a página, sem requisições constantes ao servidor. Isso não é mágica, são WebSockets em Kotlin. Se você já quis criar seu próprio chat, sistema de notificações em tempo real ou jogo multiplayer, está no lugar certo.
Neste artigo, vamos entender como os WebSockets funcionam, escrever uma aplicação em tempo real completa em Kotlin usando Ktor, e mostrarei um código que você pode executar imediatamente. Vamos lá!
O que são WebSockets e por que são necessários em Kotlin?
WebSocket é um protocolo de comunicação bidirecional entre cliente e servidor sobre uma única conexão TCP. Diferente do HTTP clássico, onde o cliente sempre inicia a requisição, o WebSocket permite que o servidor envie dados ao cliente a qualquer momento.
Por que o WebSocket é melhor que o HTTP?
- Instantaneidade: os dados são entregues em milissegundos
- Economia de tráfego: sem cabeçalhos extras como no HTTP
- Bidirecionalidade: o servidor pode iniciar o envio
- Conexão permanente: não precisa ser restabelecida a cada vez
Kotlin, com suas corrotinas e o framework Ktor, é ideal para trabalhar com WebSockets. Assincronicidade, leveza e sintaxe expressiva — é isso que torna o desenvolvimento com Kotlin WebSocket tão agradável.
Quando usar WebSockets?
Aqui estão alguns cenários onde aplicações em tempo real com Kotlin e WebSockets serão indispensáveis:
- Chats e mensageiros — transmissão de mensagens em tempo real
- Sistemas de notificações — alertas, pop-ups, atualizações de status
- Jogos online — sincronização de jogadores
- Cotações de bolsa — atualização de preços sem recarregar
- Edição colaborativa — funcionalidade estilo Google Docs
Configuração do projeto: Ktor + WebSockets
Para criar um servidor WebSocket em Kotlin, usaremos o Ktor — um framework assíncrono moderno da JetBrains. Vamos configurar o projeto.
Passo 1: Adicionar dependências
Se você usa Gradle (e tenho certeza que sim), adicione em build.gradle.kts:
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")}Passo 2: Criar o servidor WebSocket
Agora vamos escrever o servidor propriamente dito. Ele aceitará conexões e transmitirá mensagens para todos os clientes conectados — a lógica básica de um chat.
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.channels.Channelimport kotlinx.coroutines.launch
fun main() { val clients = mutableSetOf<WebSocketSession>()
embeddedServer(Netty, port = 8080) { install(WebSockets) { pingPeriod = 15_000 // 15 segundos timeout = 15_000 maxFrameSize = Long.MAX_VALUE }
routing { webSocket("/chat") { // Adiciona o cliente clients.add(this) println("Nova conexão: $this")
try { for (frame in incoming) { if (frame is Frame.Text) { val message = frame.readText() println("Recebido: $message")
// Envia para todos os clientes