2

我正在构建一个客户端-服务器应用程序,我必须在其中实现一个保活机制,以检测客户端是否崩溃。我在客户端和服务器端都有单独的线程。客户端线程发送一个“ping”然后休眠 3 秒,而服务器读取BufferedInputStream并检查是否收到 ping,如果是,则使 ping 计数器等于 0,否则它将计数器增加 +1,然后服务器线程休眠3 秒内,如果 ping 计数器达到 3,它就宣布客户端死亡。

问题是,当服务器读取输入流时,它是一个阻塞调用,它阻塞直到接收到下一个 ping,不管它有多延迟,所以服务器永远不会检测到错过的 ping。

任何建议,以便我可以读取流的当前值,并且如果传入流中没有任何内容,它不会阻塞。

谢谢,

4

2 回答 2

5

java.nioJava 1.4 引入了以包为代表的非阻塞 I/O 的概念。这可能是您需要的。

有关如何使用非阻塞 I/O 的信息,请参阅本教程。

此外,假设这不是家庭作业或学习练习,那么我建议使用更强大的协议框架,例如Apache MinaJBoss Netty,而不是从头开始构建这些东西。查看它们之间的比较,以及为什么要使用它们。

于 2010-12-30T16:50:56.613 回答
0

您可以有一个单独的监视线程来监视所有阻塞连接。当一个连接收到任何东西时,它可以重置一个计数器。(我会将任何数据包视为心跳) 您的监控线程可以在每次运行时增加此计数器,当它达到限制时(即因为它没有重置为零),您可以关闭连接。你只需要一个这样的线程。在您刚刚关闭的连接上阻塞的线程抛出 IOException,唤醒线程。

另一方面,只要有一段时间没有发送数据包,就会触发心跳。这意味着繁忙的连接不会发送任何心跳,它不应该需要。

于 2010-12-30T17:06:38.343 回答