问题描述
我目前正在尝试将我们的 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 库有任何经验吗?几乎没有文档,所以也许我做错了什么。 谢谢
解决方法
Ktor provides Websocket client support for the following engines: CIO,OkHttp,Js.
这意味着它仅适用于 JVM/JS,您可能针对的是 iOS。尚不支持,您可以关注 issue KTOR-363 获取更新
团队肯定正在努力,但现在您必须使用expect/actual自己实现它,您可以查看official example
您的代码中另一个可能的问题:host
不应包含 https://
,如果您使用的是 ssl,则应添加另一个参数:
request = {
url.protocol = URLProtocol.WSS
}
或者使用 client.wss(...)
- 这只是相同操作的简短形式