如何在Websockets ktor.io上将ping从客户端发送到服务器端

时间:2019-10-17 04:59:16

标签: kotlin websocket kotlin-coroutines ktor

我尝试搜索api文档以及示例,但是没有任何示例演示如何发送ping和接收ping。唯一的例子是如何连接到websocket并发送文本here。 我还看到了服务器端的聊天示例here,我也仔细地遵循了该示例(即在WebSocket安装的服务器端配置中设置ping间隔)。

我开始双方都在听乒乓球,但是双方都没有收到任何ping消息。

并且您无法看到here,因此无法为ping配置客户端。

我对如何发送ping感到很困惑。

这是我的服务器端:

install(WebSockets)
{
    pingPeriod = Duration.ofSeconds(20)
}

routing {
    webSocket("/ws") {
        for (frame in incoming)
        {
            when(frame)
            {
                is Frame.Pong ->
                {
                    println("ping recieved")
                }

                is Frame.Ping ->
                {
                    // just temporary block
                    println("ping recieved")
                }

                is Frame.Text ->
                {
                    println(frame.readText())
                }
            }
        }
    }
}

这是我的客户端:

val client = HttpClient {
    install(WebSockets)
}

client.ws(
    method = HttpMethod.Get,
    host = "127.0.0.1",
    port = 80,
    path = "/ws"
) {

    // pinger(outgoing, 20_000, 15_000)

    send(Frame.Text("Hello World!"))

    for (frame in incoming)
    {
        when (frame)
        {
            is Frame.Pong ->
            {
                println("ping received")
            }
        }
    }
}

我还为此here pingerponger找到了一些功能,但现在它说了它的api部分,并自动从WebsocketSession的启动开始,并且我还尝试将pinger放入客户端,但无论如何都不会向服务器发送ping。

以上代码的结果只是Hello world从客户端发送而在服务器控制台中打印出来,但没有ping收到消息。

1 个答案:

答案 0 :(得分:1)

我在让OkHttp使用ping / pong时遇到了麻烦,因此我提出了此问题https://github.com/ktorio/ktor/issues/1803,其中一位开发人员回答说:“我唯一推荐的方法是尝试CIO。是否支持手动Ping? /使用RawWebSockets处理Pong。”

我自己还没有尝试过,但是您应该查看https://github.com/ktorio/ktor/blob/master/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/RawWebSocketTest.kt