【问题标题】:Ktor CIO wss socket closes immediatelyKtor CIO wss 套接字立即关闭
【发布时间】:2019-03-08 11:22:46
【问题描述】:

使用 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())
  }
}

【问题讨论】:

    标签: websocket kotlin ktor


    【解决方案1】:

    我有一个安全 WebSockets 的问题,它已在 ktor 1.3.2 中修复。

    我还想提一下echo.websocket.org 不会关闭连接,所以 for 循环将永远暂停(期待下一个 pong 消息)。

    为了避免这种情况你可以重写

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

    作为

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

    在发送第一条消息后显式调用close() 也应该没问题,但目前不支持。我为此提交了单独的问题:https://github.com/ktorio/ktor/issues/1946

    【讨论】:

      猜你喜欢
      • 2022-10-07
      • 2019-12-11
      • 1970-01-01
      • 2016-08-06
      • 2011-01-12
      • 1970-01-01
      • 2014-04-28
      • 2017-03-20
      • 2022-07-30
      相关资源
      最近更新 更多