如何在Java 1.4中设置BufferedReader和PrintWriter的超时?

如何在使用套接字连接创建的缓冲阅读器和打印器上设置超时?以下是我现在为服务器准备的代码,它一直工作到服务器或客户端崩溃:

while(isReceiving){
    str = null;
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);

    while ((str = br.readLine()) != null){
        System.out.println("Processing command " + str);
        pw.println(client.message(str));
    }
}

在此代码的范围之外,我已强制实施 1000ms 的套接字超时,这在等待初始连接时按预期工作。但是程序在 (str = br.readLine()) 处阻塞。如果客户端挂起或崩溃,除非我终止进程,否则它永远不会停止阻止(即使这样也并不总是有效)。

有问题的客户端代码与此非常相似,并且以类似的方式阻止。


答案 1
  1. 您需要在套接字上设置读取超时,使用 。如果指定的读取超时过期,这将导致任何读取方法引发 a。NB 读取超时不是在流上设置的,而是在底层 via 上设置的Socket.setSoTimeout()SocketTimeoutExceptionSocket,Socket.setSoTimeout().

  2. TCP 中没有写入超时这样的事情。


答案 2

你可以使用Google的Guava库中的SimpleTimeLimiter

示例代码(在 Java 8 中):

BufferedReader br = ...;
TimeLimiter timeLimiter = new SimpleTimeLimiter();

try {
    String line = timeLimiter.callWithTimeout(br::readLine, 10, TimeUnit.SECONDS);
} catch (TimeoutException | UncheckedTimeoutException e) {
    // timed out
} catch (Exception e) {
    // something bad happened while reading the line
}

推荐