Сокет Ktor CIO wss закрывается немедленно

При использовании ktor CIO ws он работает должным образом, но при использовании wss немедленно закрывается. Любая помощь приветствуется. застрял на день.

Это трассировка стека, которую я получаю для wss

kotlinx.coroutines.experimental.channels.ClosedReceiveChannelException: Channel was closed
    at kotlinx.coroutines.experimental.channels.Closed.getReceiveException(AbstractChannel.kt:1067)
    at kotlinx.coroutines.experimental.channels.AbstractChannel$ReceiveElement.resumeReceiveClosed(AbstractChannel.kt:907)
    at kotlinx.coroutines.experimental.channels.AbstractSendChannel.helpClose(AbstractChannel.kt:317)
    at kotlinx.coroutines.experimental.channels.AbstractSendChannel.close(AbstractChannel.kt:254)
    at kotlinx.coroutines.experimental.channels.ChannelCoroutine.close(ChannelCoroutine.kt)
    at kotlinx.coroutines.experimental.channels.SendChannel$DefaultImpls.close$default(Channel.kt:84)
    at io.ktor.network.tls.TLSClientHandshake$input$1.doResume(TLSClientHandshake.kt:96)
    at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resumeWithException(CoroutineImpl.kt:48)
    at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resumeWithException(CoroutineImpl.kt:47)
    at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:41)
    at kotlinx.coroutines.experimental.DispatchedTask$DefaultImpls.run(Dispatched.kt:149)
    at kotlinx.coroutines.experimental.io.internal.MutableDelegateContinuation.run(MutableDelegateContinuation.kt:14)
    at io.ktor.network.util.IOCoroutineDispatcher$IODispatchedTask.run(IOCoroutineDispatcher.kt)
    at io.ktor.network.util.IOCoroutineDispatcher$IOThread$run$1.doResume(IOCoroutineDispatcher.kt:73)
    at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:42)
    at kotlinx.coroutines.experimental.DispatchedTask$DefaultImpls.run(Dispatched.kt:149)
    at kotlinx.coroutines.experimental.DispatchedContinuation.run(Dispatched.kt:13)
    at kotlinx.coroutines.experimental.EventLoopBase.processNextEvent(EventLoop.kt:140)
    at kotlinx.coroutines.experimental.BlockingCoroutine.joinBlocking(Builders.kt:70)
    at kotlinx.coroutines.experimental.BuildersKt__BuildersKt.runBlocking(Builders.kt:46)
    at kotlinx.coroutines.experimental.BuildersKt.runBlocking(Unknown Source)
    at io.ktor.network.util.IOCoroutineDispatcher$IOThread.run(IOCoroutineDispatcher.kt:68)

вот код:

httpClient.ws(host = "echo.websocket.org") {
  send(Frame.Text("Hello World"))

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

httpClient.wss(host = "echo.websocket.org") {
  send(Frame.Text("Hello World"))

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

person Marshall Walker    schedule 03.10.2018    source источник


Ответы (1)


У меня возникла проблема с безопасными веб-сокетами, и она исправлена ​​в ktor 1.3.2.

Я также хочу упомянуть, что echo.websocket.org не закрывает соединение, поэтому цикл for будет приостановлен навсегда (в ожидании следующего сообщения pong).

Чтобы избежать этого, вы можете переписать это

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

as

val pong = incoming.receive() as Frame.Text
println(pong.readText())

Также должно быть нормально вызывать close() явно после отправки первого сообщения, но пока это не поддерживается. Для этого я подал отдельную проблему: https://github.com/ktorio/ktor/issues/1946

person Leonid    schedule 15.06.2020