WebSocket

预计阅读时间: 1 分钟

本特性在构件 io.ktor:ktor-client-websocket:$ktor_version,io.ktor:ktor-client-cio:$ktor_version 中的 io.ktor.client.features.websocket.WebSockets 类中定义
dependencies { compile "io.ktor:ktor-client-websocket:$ktor_version" compile "io.ktor:ktor-client-cio:$ktor_version" }
dependencies { compile("io.ktor:ktor-client-websocket:$ktor_version") compile("io.ktor:ktor-client-cio:$ktor_version") }
<project> ... <dependencies> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-websocket</artifactId> <version>${ktor.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-websocket</artifactId> <version>${ktor.version}</version> <scope>compile</scope> </dependency> </dependencies> </project>

除了支持服务器端 WebSocket 之外,Ktor 还提供仅支持 CIO 引擎的 WebSocket 客户端。

一旦连接后,客户端与服务器的 WebSocket 就共享相同的 WebSocketSession 接口进行通信。

目前,客户端 WebSocket 仅适用于 CIO 客户端引擎

创建支持 WebSocket 的 HTTP 客户端的基本用法非常简单:

val client = HttpClient(CIO).config { install(WebSockets) }

一旦创建后就可以执行请求,启动一个 WebSocketSession

client.ws(method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/route/path/to/ws") { // this: DefaultClientWebSocketSession
    send(Frame.Text("Hello World"))

    for (message in incoming.map { it as? Frame.Text }.filterNotNull()) {
        println(message.readText())
    }
}

可以配置超时与 ping 周期:

client.ws(……) { // this: DefaultClientWebSocketSession
    timeout = Duration.ofMinutes(10)
    pingInterval = Duration.ofMinutes(10) // null 则表示禁用
}

关于 WebSocketSession 的更多信息请参见 WebSocketSession 页