如何在使用套接字连接创建的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())处阻塞。如果客户端挂起或崩溃,则除非我终止该进程,否则它永远不会停止阻塞(即使那样也并不总是起作用)。
有问题的客户端代码与此非常相似,并且以类似的方式进行阻塞。
最佳答案
您可以使用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
}