WebSocket 库 Kotlin: ktor-client-websockets
在现代 Web 开发中,实时数据交换的需求越来越常见:在线聊天、通知、股票报价、多人游戏。对于 Kotlin,处理 WebSocket 协议最强大且原生的库之一是 ktor-client-websockets——它是 Ktor(Kotlin HTTP 客户端)生态系统的一部分。
在本文中,我们将详细讲解如何使用 Ktor 在 Kotlin 中连接和使用 WebSocket。您将学习如何安装库、建立连接、发送和接收消息,以及处理错误和关闭连接。
什么是 WebSocket 以及为什么需要它?
WebSocket 是一种协议,它在客户端(例如 Android 应用或服务器)和服务器之间提供持久的双向连接。与 HTTP 不同,HTTP 中客户端每次都需要发起请求,而 WebSocket 允许服务器在数据出现时立即将其发送给客户端。它非常适合用于:
- 聊天和即时通讯应用;
- 通知和事件流;
- 游戏和协作编辑器;
- 金融行情和交易。
安装 ktor-client-websockets 库
首先,将依赖项添加到您的 build.gradle.kts(Kotlin/JVM 或 Kotlin Multiplatform 项目)。
// build.gradle.ktsdependencies { implementation("io.ktor:ktor-client-core:2.3.7") implementation("io.ktor:ktor-client-cio:2.3.7") // 或其他引擎 implementation("io.ktor:ktor-client-websockets:2.3.7")}如果您使用 Kotlin Multiplatform,请确保为每个平台添加模块(例如,Android 使用 ktor-client-okhttp)。
创建 WebSocket 客户端
用于处理 WebSocket 的主要类是带有 WebSockets 插件的 HttpClient。让我们看一个连接到 WebSocket 服务器的最简单示例。
import io.ktor.client.*import io.ktor.client.plugins.websocket.*import io.ktor.websocket.*
suspend fun main() { val client = HttpClient { install(WebSockets) }
client.webSocket("ws://echo.websocket.org") { // 发送消息 send(Frame.Text("你好, WebSocket!"))
// 接收响应 for (frame in incoming) { when (frame) { is Frame.Text -> { println("收到: ${frame.readText()}") } else -> println("其他类型的帧: $frame") } } }
client.close()}在这段代码中,我们:
- 创建了一个支持 WebSocket 的 HTTP 客户端。
- 与测试服务器
ws://echo.websocket.org建立连接。 - 发送了一条文本消息。
- 读取传入的帧并将其输出到控制台。
处理错误和关闭连接
在实际应用中,正确处理异常和关闭连接非常重要。使用 try-catch 和 finally。
import io.ktor.client.*import io.ktor.client.plugins.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.*
suspend fun main() = coroutineScope { val client = HttpClient { install(WebSockets) }
try { client.webSocket("ws://your-server.com/ws") { // 发送 send(Frame.Text("Ping"))
// 带超时接收 withTimeout(5000) { for (frame in incoming) { if (frame is Frame.Text) { println("响应: ${frame.readText()}") } } } } } catch (e: Exception) { println("WebSocket 错误: ${e.message}") } finally { cli