Как отправлять пинги на веб-сокеты Ktor

Я попытался выполнить поиск в документации api, а также в примерах, но не было ни одного примера, демонстрирующего, как отправлять пинги и получать пинги. Единственным примером было то, как подключиться к websocket и отправить текст сюда. Я также видел образец чата здесь на стороне сервера, и я тоже внимательно следил за ним (т.е. установить интервал пинга в конфигурации на стороне сервера установки WebSocket).

Я начинаю слушать понги с обеих сторон, но ни одна из сторон не получала никаких сообщений о пинге.

И нет возможности настроить клиентскую сторону для пингов, как вы можете увидеть здесь < / а>.

Я так запутался в том, как отправлять пинги.

Это моя серверная часть:

embeddedServer(
    CIO,
    80
) {
    install(io.ktor.websocket.WebSockets) {
        pingPeriod = Duration.ofSeconds(20)
    }

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

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

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

Это моя клиентская сторона:

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

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

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

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

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

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

Результат:

Hello World!

то есть веб-сокет подключен, текст может передаваться, но, к сожалению, не может использовать функцию пинг / понг.

Я также нашел несколько функций для этого здесь pinger и ponger, но теперь он говорит о своей части api и автоматически запускается с инициированием WebsocketSession, и я также попытался установить пингер на стороне клиента, но это не отправило пинг на сервер вообще.

Результатом приведенного выше кода является просто Hello world печатается в консоли сервера как отправленное со стороны клиента, но не полученные сообщения ping.


person Animesh Sahu    schedule 17.10.2019    source источник


Ответы (1)


У меня возникли проблемы с получением OkHttp для использования ping / pong, поэтому я зарегистрировал эту проблему https://github.com/ktorio/ktor/issues/1803, и один из разработчиков ответил: «Единственное, что я могу вам порекомендовать, это попробовать CIO. Поддерживает ручную обработку Ping / Pong с использованием RawWebSockets».

Сам не пробовал, но вам стоит проверить https://github.com/ktorio/ktor/blob/master/ktor-features/ktor-websockets/jvm/test/io/ktor/tests/websocket/RawWebSocketTest.kt

person Eric    schedule 04.05.2020
comment
Правда, веб-сокеты не полностью настраиваются, только текстовый фрейм - это то, что мы в настоящее время можем получить через реализацию по умолчанию, я прокомментировал проблему, давайте посмотрим, каков ответ. Было бы лучше, если бы мы могли унаследовать некоторые функции от реализации по умолчанию, чтобы создать собственную реализацию. Было бы беспорядком воссоздавать реализацию, если у вас есть идеи, пожалуйста, опубликуйте ее. - person Animesh Sahu; 04.05.2020