首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ktor CIO wss套接字立即关闭

Ktor CIO wss套接字立即关闭
EN

Stack Overflow用户
提问于 2018-10-03 17:07:47
回答 1查看 700关注 0票数 5

当使用ktor CIO ws时,它会按预期工作,但当使用wss时,它会立即关闭。任何帮助都是非常感谢的。已经被困了一天了。

这是我为wss获取的堆栈跟踪

代码语言:javascript
复制
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)

代码如下:

代码语言:javascript
复制
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())
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-06-15 17:20:45

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

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

为了避免这种情况,您可以重写此代码

代码语言:javascript
复制
for (message in incoming.map { it as? Frame.Text }.filterNotNull()) {
    println(message.readText())
}

作为

代码语言:javascript
复制
val pong = incoming.receive() as Frame.Text
println(pong.readText())

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52623482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档