我正在使用java开发一个nodemcu websocket服务器android客户端应用程序。我成功创建了客户端,并通过websocket客户端服务连接到它。我可以在发送数据时检测到服务器故障/关闭。但在故障时无法检测到,也就是说,如果服务器断电,在发送一些数据之前无法知道。如何知道故障时的服务器故障。使用okhttp 4.1.0 library.ca有人能帮助吗
如何知道服务器在故障时的故障。使用okhttp 4.1.0库。任何人都能帮助吗
你不能。这是不可能的,但是,有一些解决办法,见下文。
为什么不可能?在内部,互联网是数据包交换,这意味着数据首先被收集到数据包中,然后这些数据包被发送。
你在网上做的大多数事情都感觉像是"流"(你发送1个字符,一个字符到达另一边(。但这一切都是基于建立在互联网数据包本质之上的协议。
当您通过互联网在两台计算机之间建立开放连接时,实际上根本没有发送任何数据。这不像你预订了线路。旧的电话网络确实是这样工作的:当你给某人打电话时,你会得到一条专线,一旦线路中断,你会听到嘟嘟声来表明这一点。
互联网不是这样运作的。那些电线和其间的一切都不知道有一个开放的连接。这只是你电脑和服务器上的一些内存,让他们识别某些数据包,作为这两台机器进行的更长对话的一部分,仅此而已。
因此,我们得出了为什么这是不可能的:考虑到在一方真正向另一方发送数据之前,没有任何数据包流动,因此无法区分"现在没有发送数据"one_answers"有人被服务器园区的电缆绊倒"。这就是为什么你在发送东西之前不会得到这些信息(你之所以会收到这封信,只是因为当你发送东西时,协议规定服务器会向你发回一份确认收到你发送的东西的确认书。如果时间太长,你的电脑会再发送几次,以防数据包在某个地方丢失,最终会放弃并得出结论,即服务器无法再连接、崩溃或断电那么你得到IOException了吗(。
解决方法
一个简单的方法是升级您自己的协议:指定服务器或客户端(无论谁负责(至少每分钟发送一次无所事事的消息。然后,你可以在100秒左右没有收到消息后得出结论,认为连接可能已经断开。你可以启动一个计时器100秒,每次收到任何数据都可以重置它。如果计时器用完了?连接可能已断开。
这在某种程度上采纳了协议中内置的这一想法,使您能够建立感觉像数据流的连接。该协议被称为TCP/IP,其功能被称为KeepAlive。
问题是,您可能无法指定网络套接字连接的TCP/IP设置。如果可以的话,你可以打开keepalive(例如,在java中,你使用Socket进行原始TCP/IP连接,它有一个.setSoKeepAlive(true)
方法。如果你可以访问Socket,请查看API,或者扫描文档中的"keepalive",看看是否有任何内容。
我打赌不会有,这意味着你必须使用我上面提到的技巧:更新你的服务器代码,使用计时器发送"你好!"在任何对话后60秒,并在100秒后更新客户端代码以放弃连接(再给它40秒;有时互联网有点备份或服务器有点忙(。