Bibliothèque WebSocket Kotlin : Ktor WebSocket
WebSocket est un protocole qui assure une connexion bidirectionnelle permanente entre un client et un serveur. Dans l'écosystème Kotlin, l'une des bibliothèques les plus puissantes et populaires pour travailler avec WebSocket est Ktor — un framework asynchrone créé par la société JetBrains. Ktor offre un support complet de WebSocket côté serveur comme côté client, permettant de créer facilement des applications en temps réel : chats, notifications, jeux en ligne, trackers de données et bien plus encore.
Dans cet article, nous allons détailler comment utiliser WebSocket en Kotlin avec Ktor. Vous apprendrez à configurer les dépendances, créer un serveur et un client WebSocket, envoyer et recevoir des messages, ainsi que gérer les erreurs et la fermeture de connexion.
Installation et configuration
Pour commencer, ajoutez les dépendances nécessaires dans le fichier build.gradle.kts (ou build.gradle). Si vous utilisez Gradle, ajoutez les modules suivants :
// build.gradle.ktsdependencies { // Partie serveur 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")
// Partie client 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")}Pour Maven, utilisez des artefacts similaires. Tous les modules Ktor version 2.x.x prennent en charge les coroutines Kotlin et fonctionnent sur JVM, Android, iOS et d'autres plateformes.
Création d'un serveur WebSocket avec Ktor
Écrivons un simple serveur écho qui reçoit les messages du client et les renvoie. Le serveur écoutera sur le port 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("Bienvenue dans le chat !") for (frame in incoming) { if (frame is Frame.Text) { val text = frame.readText() println("Reçu : $text") send("Écho : $text") } } } } }.start(wait = true)}Dans cet exemple :
install(WebSockets)— active le plugin WebSocket sur le serveur.webSocket("/chat")— définit le point de terminaison pour la connexion.send()— envoie un message au client.incoming— le canal par lequel les trames arrivent du client.- Les trames peuvent être textuelles (
Frame.Text), binaires (Frame.Binary) ou de contrôle.
Création d'un client WebSocket avec Ktor
Écrivons maintenant un client qui se connecte à notre serveur, envoie un message de bienvenue et lit les réponses.
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") { // Lire le message de bienvenue val welcome = incoming.receive() as Frame.Text println("Serveur : ${welcome.readText()}")
// Envoyer un message send(Frame.Text("Bonjour, serveur !"))
// Attendre la réponse écho val response = incoming.receive() as Frame.Text println("Serveur : ${response.readText()}")
// Fermer la connexion close() }
client.close()}Le client utilise deu