gpt4 book ai didi

java - 如何确保 LAN 故障立即导致 InterruptedException

转载 作者:行者123 更新时间:2023-11-30 05:51:35 28 4
gpt4 key购买 nike

我在服务器中有一个线程(线程 a)正在执行 object = ois.readObject();。当我从客户端拔出 LAN 线时,该线程没有异常并继续从流中读取。

服务器上的另一个线程(线程 b)每隔一秒尝试向客户端写入一个字节,以检查连接是否仍然存在:checkingStream.writeObject(b);

当我拉这根线时,我从 checkingStream.writeObject(b); 得到了一个 IOException。我希望“线程 b”导致“线程 a”停止从流中读取并继续执行代码/抛出异常。

threadA.interrupt(); 不工作。我该怎么办?

最佳答案

When I pull out the LAN wire from the client, this thread does not get an exception and is continuing reading from the stream.

好吧,我会说这是正确的行为。互联网(通常)和基于 IP 的网络协议(protocol)旨在适应本地中断……例如与网络断开连接。

您的问题是读取线程正在做的任何事情都没有告诉网络堆栈它希望每秒传送数据。因此网络堆栈无法判断网络是否存在问题...或远程服务...或者 1 秒内没有数据只是正常行为。

解决方案是按照 EJP 的建议设置读取超时,或者删除旨在始终检测网络是否存在的内容。我推荐后者。除非您有一个压倒一切的特定应用程序需要知道网络始终存在,否则最好忽略任何短期网络中断,和/或将您的应用程序级协议(protocol)设计为具有弹性。


threadA.interrupt(); does not do work. What shall I do?

读取超时是一种选择。解除阻塞的 read 调用的另一种方法是让另一个线程调用 Socket 上的 close()。这将导致与套接字关联的 Java 流上的任何挂起读取或写入异常终止。


关于读取超时:

but other answers in this forum say it is unsafe

在收到超时异常后尝试继续使用套接字是不安全的。如果您使用超时,则需要在套接字级超时后丢弃连接并创建一个新连接。

如果您不想这样做,则需要以不同的方式实现超时。例如,创建一个新线程来监视读取线程的状态及其读取的数据。如果新线程检测到读取线程没有 Activity ,它可以发出警报...同时让读取线程在读取调用中阻塞,以防连接恢复正常。

关于java - 如何确保 LAN 故障立即导致 InterruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549758/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com