WebSocket sur Kotlin : création d'applications temps réel de zéro
Les applications web modernes exigent de plus en plus souvent un transfert instantané de données entre le client et le serveur. Le HTTP traditionnel, fonctionnant selon le principe « requête-réponse », ne convient pas pour les tâches nécessitant une communication bidirectionnelle constante — chats, jeux en ligne, cotations boursières ou notifications en temps réel. C'est ici que le protocole WebSocket vient à la rescousse. Dans cet article, nous allons voir comment créer des applications temps réel avec Kotlin en utilisant WebSocket, de la théorie de base aux exemples pratiques.
Kotlin, grâce à sa concision, sa sécurité et sa compatibilité totale avec l'écosystème Java, est un excellent choix pour le développement côté serveur. Comme framework principal, nous utiliserons Ktor — un framework asynchrone moderne pour Kotlin qui prend en charge nativement WebSocket.
Qu'est-ce que WebSocket et pourquoi en a-t-on besoin ?
WebSocket est un protocole assurant une communication full-duplex (bidirectionnelle) entre le client et le serveur via une seule connexion TCP persistante. Contrairement à HTTP, où le client est toujours l'initiateur de la requête, WebSocket permet au serveur d'envoyer des données au client à tout moment.
Principaux avantages de WebSocket :
- Faible latence : Pas de frais généraux pour établir une nouvelle connexion pour chaque message.
- Efficacité : Trafic de service minimal (seulement 2 octets par message après l'établissement de la connexion).
- Connexion persistante : Le serveur peut envoyer des données en temps réel sans interrogation de la part du client.
WebSocket est idéal pour :
- Chats en ligne et messageries instantanées
- Édition collaborative de documents
- Cotations boursières et financières
- Jeux multijoueurs
- Notifications push et surveillance
Configuration d'un projet Ktor pour WebSocket
Avant d'écrire du code, il est nécessaire de configurer le projet. Le plus simple est de le faire via IntelliJ IDEA avec le plugin Ktor, ou manuellement via Gradle.
Étape 1 : Création du projet
Créez un nouveau projet Gradle avec Kotlin (JVM). Dans le fichier build.gradle.kts, ajoutez les dépendances suivantes :
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")}Étape 2 : Structure de base du serveur
Créons le fichier Application.kt et écrivons un serveur WebSocket minimal :
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("Bienvenue dans le chat !") for (frame in incoming) { if (frame is Frame.Text) { val text = frame.readText() send("Vous avez écrit : $text") println("Reçu : $text") } } } }.start(wait = true)}Ce code démarre un serveur sur le port 8080, qui accepte les connexions WebSocket à l'adresse /chat. Lors de la connexion, le client reçoit un message de bienvenue, puis le serveur répond à chaque message texte par un écho.
Création d'un chat avancé avec salles
Passons maintenant à un exemple plus complexe — multi