Okhttp websocket 服务器关机检测
Posted
技术标签:
【中文标题】Okhttp websocket 服务器关机检测【英文标题】:Okhttp websocket server Shutdown detection 【发布时间】:2021-08-07 14:40:55 【问题描述】:我正在使用java开发一个nodemcu websocket服务器android客户端应用程序。我成功创建了客户端并通过websocket客户端服务连接到它。我可以在发送数据时检测到服务器故障/关闭。但当时无法检测到失败的原因是服务器关闭电源直到发送一些数据才能知道。如何在失败时知道服务器故障。使用 okhttp 4.1.0 库。任何人都可以帮忙
【问题讨论】:
【参考方案1】:发生故障时如何知道服务器故障。使用okhttp 4.1.0库。谁能帮忙
你不能。这是不可能的,但是,有一些解决方法,见下文。
为什么不可能?在内部,互联网是分组交换的,这意味着数据首先被收集成数据包,然后这些数据包被发送。
您在网络上所做的大部分事情都感觉像是“流”(您发送 1 个字符,一个字符到达另一侧)。但这一切都基于建立在互联网数据包性质之上的协议。
当您通过互联网在两台计算机之间建立开放连接时,实际上根本不会发送任何数据。这不像您预留了一条线路。旧的电话网络确实是这样工作的:当你拨打某人时,你有一条专线,一旦线路中断,你会听到哔哔声来表明这一点。
互联网不是这样运作的。那些电线和介于两者之间的所有东西根本不知道有一个开放的连接。这只是您计算机和服务器上内存中的一些位,它们可以让他们将某些数据包识别为这两台机器进行的较长对话的一部分。
因此,我们得出了为什么这是不可能的:鉴于在一方实际向另一方发送数据之前没有任何数据包在流动,因此无法区分“现在没有数据正在发送”和“某人”之间的区别被服务器园区的电源线绊倒”。这就是为什么在您发送某些东西之前您不会获得该信息的原因(您获得该信息的原因只是因为当您发送某些东西时,协议规定服务器会向您发回收到您发送的内容的确认。如果这需要太长时间,您的计算机会再发送几次,以防数据包在某个地方丢失,最终会放弃并得出服务器无法再访问或崩溃或断电的结论,然后您才会收到 IOException) .
解决方法
一个简单的方法是升级您自己的协议:规定服务器或客户端(无论谁负责执行此操作)至少每分钟发送一次无操作消息。然后,您可以在 100 秒左右未收到该连接后得出结论,因此连接可能已失效。您可以启动一个 100 秒的计时器,每次收到任何数据时都可以重置它。如果计时器用完?连接可能已断开。
这在某种程度上是对内置在协议中的这个想法的采纳,它让您可以建立感觉像数据流的连接。该协议称为 TCP/IP,功能称为KeepAlive。
问题是,您可能无法为您的 websocket 连接指定 TCP/IP 设置。如果可以,您可以打开 keepalive(例如,在 java 中,您使用 Socket 建立原始 TCP/IP 连接,它有一个 .setSoKeepAlive(true)
方法。检查 API 是否可以访问套接字或扫描文档'keepalive',看看那里有没有什么。
我打赌不会,这意味着您必须使用我上面提到的技巧:更新您的服务器代码以使用计时器发送“你好!”任何对话后 60 秒,然后更新您的客户端代码以在 100 秒过去后放弃连接(再给它 40 秒;有时互联网会有点备份或服务器有点忙)。
【讨论】:
Okhttp websocket 客户端为 pingintervel 提供了一个选项,我可以用它来检查服务器状态吗?或者你能建议一个吗?我在这方面完全是新手。以上是关于Okhttp websocket 服务器关机检测的主要内容,如果未能解决你的问题,请参考以下文章
OkHttp Websockets - 连接到 websocket 时添加一个主体
无法从android okhttp3连接到节点websocket
Android,Okhttp - 如何将子协议添加到 websocket 连接
(二十)ATP应用测试平台——websocket实现微服务版在线客服聊天室实战案例