如何识别 ktor websocket 连接丢失?

How to identify a ktor websocket connection loss?

一段时间以来,我一直在研究示例 Ktor websocket 应用程序。我现在拥有的是一个托管 websocket 服务器的桌面应用程序和一个充当客户端的 android 应用程序。

我知道服务器可以跟踪它的客户端。这样我就可以确定特定客户端是否已连接。例如,如果 android 应用程序在连接到服务器时关闭,服务器会立即知道连接丢失。

这是演示相同内容的代码片段,

routing {
                webSocket("/endpoint") {
                    try {
                        // Connection established
                    } catch (e: Exception) {
                        // Exceptions
                    } finally {
                        // Connection is lost
                    }
                }
            }

当客户端应用程序失去互联网或关闭时,套接字连接的服务器实例立即进入 finally 块。这样我们就可以确定与该客户端的连接丢失了。

如果反过来呢?如果服务器应用程序丢失互联网或关闭怎么办?客户端如何将此识别为连接丢失?

我在文档中的任何地方都找不到与此相关的任何内容,这是我编写的相关客户端代码,

webSocketSession = client.webSocketSession(
            method = HttpMethod.Get,
            host = hostUrl,
            port = port,
            path = "endpoint"
        )

我找不到任何可以附加到 webSocketSession 对象的回调来帮助解决这个问题。即使 webSocketSession.send("message") 也不会抛出任何错误。它只是安静地失败了。

当服务器关闭时,是否可以通知客户端,如果失败,是否可以从 webSocketSession.send() 调用中获得某种状态?

我真的需要了解服务器何时关闭,所以我可以尝试从客户端重新建立连接。

谢谢。

要获得与服务器的连接丢失的通知,您可以在尝试接收消息时捕获 ClosedReceiveChannelException

val client = HttpClient(CIO) {
    install(WebSockets) {}
}

client.ws("ws://localhost:6060/") {
    try {
        while (true) { incoming.receive() }
    } catch (e: ClosedReceiveChannelException) {
        // Connection is lost
    }
}