有没有办法在特定的时间内读取输入流?

时间:2011-03-03 10:18:48

标签: java stream timeout inputstream

我遇到这样一种情况:线程打开到目标m / c的telnet连接,并从程序中读取数据,该程序吐出其缓冲区中的所有数据。刷新完所有数据后,目标程序将打印一个标记。我的线程一直在寻找这个标记来关闭连接(成功读取)。

有时,目标程序不会打印任何标记,它会继续转储数据并且我的线程继续读取它(目标程序没有打印标记)。

所以我想仅在特定时间段内读取数据(比如15分钟/可配置)。有没有办法在java API级别执行此操作?

4 个答案:

答案 0 :(得分:2)

使用另一个线程在15分钟后关闭连接。或者,您可以在每次读取后检查是否已经过了15分钟,然后只是停止读取并清除连接,但这只有在您确定远程服务器将继续发送数据时才会起作用(如果读取不会阻止无限期)。

答案 1 :(得分:2)

一般来说,没有。输入流不提供超时功能。

但是,在您的特定情况下,即从套接字读取数据,是的。您需要做的是set the SO_TIMEOUT on your socket到非零值(以毫秒为单位所需的超时)。阻止指定时间的任何读取操作都将抛出SocketTimeoutException

请注意,即使您的套接字连接在此之后仍然有效,继续读取它可能会带来意想不到的结果,因为您已经消耗了一半的数据。处理此问题的最简单方法是关闭连接,但如果您已经记录了已阅读的内容,则可以选择恢复并继续阅读。

答案 2 :(得分:2)

如果您使用Java Socket进行通信,则应该查看setSoTimeout(int)方法。

套接字上的read()操作将仅在指定时间内阻塞。之后,如果没有收到任何信息,将引发java.net.SocketTimeoutException,如果处理正确,将继续执行。

答案 3 :(得分:0)

如果服务器确实永远转储数据,则永远不会在读取操作中阻止客户端。因此,您可以定期检查(读取之间)当前时间减去开始时间是否超过可配置延迟,如果有,则停止读取。

如果客户端可以在同步读取中被阻塞,等待服务器输出某些内容,那么您可以使用SocketChannel,并启动一个中断主读取线程的计时器线程,或者关闭其输入,或关闭频道。