0

我目前正在尝试将我们的 Kotlin 多平台项目连接到 websockets。我想使用 ktor-websockets 库从我们的后端接收一些更新,但幸运的是,当我运行此代码时,没有任何反应:

client.webSocket(
            port = 80,
            method = HttpMethod.Get,
            host = "https://uat-betws.sts.pl",
            path = "/ticket?token=eyJzdWIiOiI0ZmY5Y2E1Mi02ZmEwLTRiYWYtODlhYS0wODM1NGE2MTU0YjYiLCJpYXQiOjE2MTk4MDAwNzgsImV4cCI6MTYxOTgwMzY3OH0.oIaXH-nFDpMklp4FSJWMtsM7ECSIfuNF99tTQxiEALM"
        )
        {
            for (message in incoming) {
                message as? Frame.Text ?: continue
                val receivedText = message.readText()
                println(receivedText)
            }
            // Consume all incoming websockets on this url
            this.incoming.consumeAsFlow().collect {
                logger.d("Received ticket status websocket of type ${it.frameType.name}")
                if (it is Frame.Text) {
                    Json.decodeFromString<TicketStatusResponse>(it.readText())
                }
            }
        }

有人对 ktor-websockets 库有任何经验吗?几乎没有文档,所以也许我做错了什么。谢谢

4

1 回答 1

2

正如文件所说

Ktor provides Websocket client support for the following engines: CIO, OkHttp, Js.

这意味着它仅适用于 JVM/JS,您可能针对的是 iOS。尚不支持,您可以关注 issue KTOR-363进行更新

当然团队正在努力,但现在你必须自己使用期望/实际来实现它,你可以查看官方示例

代码中另一个可能的问题:host不应该包含https://,如果您使用的是 ssl,则应该添加另一个参数:

request = {
    url.protocol = URLProtocol.WSS
}

或使用client.wss(...)- 这只是相同操作的简写形式

于 2021-04-30T20:33:59.857 回答