尝试在客户端接收数据时,Ktor-websocket 库不执行任何操作

Posted

技术标签:

【中文标题】尝试在客户端接收数据时,Ktor-websocket 库不执行任何操作【英文标题】:Ktor-websocket library do nothing when trying to receive data on client 【发布时间】:2021-07-24 00:42:11 【问题描述】:

我目前正在尝试将我们的 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 库有任何经验吗?几乎没有文档,所以也许我做错了什么。 谢谢

【问题讨论】:

【参考方案1】:

正如the documentation 所说

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

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

确定团队正在努力,但现在你必须自己使用期望/实际来实现它,你可以查看official example

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

request = 
    url.protocol = URLProtocol.WSS

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

【讨论】:

以上是关于尝试在客户端接收数据时,Ktor-websocket 库不执行任何操作的主要内容,如果未能解决你的问题,请参考以下文章

TCP Socket在C#中接收数据错误

Websocket 无法接收数据

IPC反序列化异常仅在接收数据时?发送工作正常

Server-Client 通信按时间间隔发送和接收数据

C ++多线程套接字无法接收客户端数据

Java UDP 客户端不接收数据包