如何识别 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
}
}
一段时间以来,我一直在研究示例 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
}
}