【问题标题】:How to identify a ktor websocket connection loss?如何识别 ktor websocket 连接丢失?
【发布时间】:2021-06-04 08:50:07
【问题描述】:

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

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

这是一个演示相同的代码sn-p,

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() call 获得某种状态?

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

谢谢。

【问题讨论】:

    标签: websocket ktor


    【解决方案1】:

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

    val client = HttpClient(CIO) {
        install(WebSockets) {}
    }
    
    client.ws("ws://localhost:6060/") {
        try {
            while (true) { incoming.receive() }
        } catch (e: ClosedReceiveChannelException) {
            // Connection is lost
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 2012-07-26
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多