Kotlin上的WebSocket:从零开始构建实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 WebSocket 和 Kotlin 是实时应用的完美组合

现代 Web 应用程序越来越需要即时数据传输:从聊天、在线游戏到股票报价和监控系统。传统的 HTTP 及其请求-响应模型对于此类任务效率低下——它会造成延迟和冗余流量。这时,WebSocket 应运而生——这是一种提供客户端和服务器之间永久双向连接的协议。

Kotlin 以其简洁的语法、与 Java 的完全兼容性以及对协程的强大支持,非常适合创建实时应用程序。JetBrains 的 Ktor 框架提供了内置的 WebSocket 支持,让您只需几行代码即可编写高性能且安全的代码。

在本文中,我们将详细讲解如何使用 Kotlin 和 WebSocket 创建一个完整的实时应用程序。您将学到:

  • 如何在 Ktor 上设置 WebSocket 服务器
  • 如何从浏览器或移动应用程序连接到它
  • 如何组织实时消息交换
  • 哪些模式和方案可用于扩展

1. WebSocket 基础知识及其在 Kotlin 中的优势

什么是 WebSocket?

WebSocket 是一种基于 TCP 工作的协议。通过 HTTP 握手(升级)建立连接后,客户端和服务器可以双向交换数据,无需重复请求。这大大降低了延迟并减少了网络负载。

为什么选择 Kotlin?

  • 协程 — 允许处理数千个并发 WebSocket 连接而不阻塞线程。
  • Ktor — 一个轻量级的异步框架,原生支持 WebSocket。
  • 类型安全 — 在编译时而不是运行时发现错误。
  • 跨平台 — 同一代码可以在 JVM、JS 和 Native 上运行。

2. 在 Ktor 上创建 WebSocket 服务器

第 1 步:项目设置

在 build.gradle.kts 中添加依赖:

dependencies {
    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")
    implementation("ch.qos.logback:logback-classic:1.4.11")
}

第 2 步:使用 WebSocket 的基本服务器

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(Frame.Text("欢迎加入聊天!"))
            for (frame in incoming) {
                if (frame is Frame.Text) {
                    val text = frame.readText()
                    println("收到: $text")
                    send(Frame.Text("回声: $text"))
                }
            }
        }
    }.start(wait = true)
}

这段代码创建了一个简单的回声服务器。连接后,客户端会收到一条欢迎消息,并且其发送的每条消息都会加上前缀"回声:"返回。

第 3 步:处理多个客户端和广播

对于实时聊天,您需要存储活动会话列表:

import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.websocket.*
import io.ktor.websocket.*
import kotlinx.coroutines.channels.ConcurrentHashMap

val clients = ConcurrentHashMap<String, WebSocketSession>()

fun main() {
    embeddedServer(Netty, port = 8080) {
        install(WebSockets)
        webSocket("/chat") {
            val userName = "用户_${System.currentTimeMillis()}"
            clients[userName] = this
            try {                

博客

书籍推荐