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

标签 java sockets bufferedreader java1.4 printwriter

如何在使用套接字连接创建的 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));
    }
}

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

相关的客户端代码与此非常相似,并且以类似的方式进行阻塞。

最佳答案

  1. 您需要在套接字上设置读取超时,使用 Socket.setSoTimeout() 。这将导致任何读取方法抛出 SocketTimeoutException如果指定的读取超时时间到期。注意:读取超时不是在流上设置的,而是在底层设置的 Socket,通过Socket.setSoTimeout().

  2. TCP 中不存在写入超时之类的东西。

关于java - 如何在 Java 1.4 中设置 BufferedReader 和 PrintWriter 的超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55948209/

相关文章:

java - 使用Buffered Reader和Writer删除文本文件中的空行;但我总是把最后一行留空

java - 从每个 ArrayList 对象具有多个值的 ArrayList 写入文本文件 (java)

java - 使用 proxool 时,是否需要显式关闭每个 getConnection()?

java - 使用 Jsoup Scala 解析 HTML 表

java - Jsoup formElement.submit().post() 未提交指定的值

使用 stoppbit 的 Python 套接字

java - Android webview vs. imageview 显示图片的性能

Java - 如何循环读取InputStream,直到用户输入继续?

node.js - 重新启动 Node 时套接字的奇怪行为 - 有什么想法吗?

java - 使用 BufferedReader 将字符串转换为 int