WebSocket em Kotlin: criação de aplicações em tempo real do zero
As aplicações web modernas exigem cada vez mais transferência instantânea de dados entre cliente e servidor. O HTTP tradicional, que funciona no princípio de "requisição-resposta", não é adequado para tarefas que exigem comunicação bidirecional constante — chats, jogos online, cotações de bolsa ou notificações em tempo real. É aqui que o protocolo WebSocket entra em ação. Neste artigo, vamos explorar como criar aplicações em tempo real em Kotlin usando WebSocket, desde a teoria básica até exemplos práticos.
Kotlin, graças à sua concisão, segurança e total compatibilidade com o ecossistema Java, é uma excelente escolha para o desenvolvimento de backend. Como framework principal, usaremos o Ktor — um framework assíncrono moderno para Kotlin que possui suporte nativo a WebSocket.
O que é WebSocket e por que é necessário?
WebSocket é um protocolo que fornece comunicação full-duplex (bidirecional) entre cliente e servidor através de uma única conexão TCP persistente. Ao contrário do HTTP, onde o cliente é sempre o iniciador da requisição, o WebSocket permite que o servidor envie dados ao cliente a qualquer momento.
Principais vantagens do WebSocket:
- Baixa latência: Sem custos adicionais para estabelecer uma nova conexão para cada mensagem.
- Eficiência: Tráfego de controle mínimo (apenas 2 bytes por mensagem após o estabelecimento da conexão).
- Conexão persistente: O servidor pode enviar dados em tempo real sem necessidade de polling do cliente.
WebSocket é ideal para:
- Chats online e mensageiros
- Edição colaborativa de documentos
- Cotações de bolsa e financeiras
- Jogos multijogador
- Notificações push e monitoramento
Configuração do projeto Ktor para WebSocket
Antes de escrever código, é necessário configurar o projeto. A maneira mais fácil é através do IntelliJ IDEA com o plugin Ktor, ou manualmente via Gradle.
Passo 1: Criação do projeto
Crie um novo projeto Gradle com Kotlin (JVM). No arquivo build.gradle.kts, adicione as seguintes dependências:
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")}Passo 2: Estrutura básica do servidor
Crie o arquivo Application.kt e escreva um 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("Bem-vindo ao chat!") for (frame in incoming) { if (frame is Frame.Text) { val text = frame.readText() send("Você escreveu: $text") println("Recebido: $text") } } } }.start(wait = true)}Este código inicia um servidor na porta 8080, que aceita conexões WebSocket no endereço /chat. Ao conectar, o cliente recebe uma mensagem de boas-vindas e, em seguida, o servidor responde a cada mensagem de texto com um eco.
Criação de um chat avançado com salas
Agora vamos para um exemplo mais complexo — um chat m