关于 url:如何根据 Java 中的 URLConnection 对 BufferedReader 设置超时?

关于 url:如何根据 Java 中的 URLConnection 对 BufferedReader 设置超时?

How can I set a timeout against a BufferedReader based upon a URLConnection in Java?

我想读取 URL 的内容,但不想在 URL 无响应时"挂起"。我使用 URL 创建了一个 BufferedReader...

1
2
3
4
URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

...然后开始循环读取内容...

1
2
3
4
5
6
7
8
9
10
11
do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\
"
);
        }
    }
while (buf != null);

...但如果读取挂起,则应用程序挂起。

有没有一种方法,无需将代码打磨到套接字级别,在必要时"超时"读取?


我认为 URLConnection.setReadTimeout 是您正在寻找的。


如果你有 java 1.4:

我认为连接超时 (URLConnection.setConnectTimeout(int timeout) ) 没有用,因为您正在执行某种流式传输。

---不杀线程---可能会导致未知问题,打开描述符等

生成一个 java.util.TimerTask,您将在其中检查是否已完成该过程,否则,关闭 BufferedReader 和 URLConnection 的 OutputStream

插入一个布尔标志 isFinished 并在循环结束时将其设置为 true,在循环之前将其设置为 false

1
2
3
4
5
6
7
8
9
10
TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

这可能会导致 ioexception,所以你必须抓住它。例外本身并不是一件坏事。
我省略了一些声明(即决赛),因此匿名类可以访问您的变量。如果没有,则创建一个维护引用的 POJO 并将其传递给 timertask


从 Java 1.5 开始,可以通过 URLConnection 类上的 'setReadTimeout(int timeout)' 方法在底层套接字上设置读取超时(以毫秒为单位)。

请注意,还有 'setConnectTimeout(int timeout)' 将对与远程服务器的初始连接执行相同的操作,因此设置它也很重要。


对于 Java 1.4,您可以使用来自 Apache

的 SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT)


我最近一直在 JVM 1.4 环境中处理这个问题。常用的答案是使用系统属性 sun.net.client.defaultReadTimeout(读取超时)和/或 sun.net.client.defaultConnectTimeout。这些记录在 Networking Properties 中,可以通过 Java 命令行上的 -D 参数或通过 System.setProperty 方法调用进行设置。

假设这些是由实现缓存的,因此您不能将它们从一种事物更改为另一种事物,因此它们被使用一次,值将被保留。

它们也不适用于 SSL 连接 ala HttpsURLConnection。还有其他方法可以使用自定义 SSLSocketFactory.

同样,这一切都适用于 JVM 1.4.x。在 1.5 及更高版本中,您可以在 API 中使用更多方法(如上述其他响应者所述)。


推荐阅读

    linux服务器超时命令?

    linux服务器超时命令?,系统,信息,服务,情况,网站,第一,工作,软件,体系,平均,l

    linux读取硬盘命令?

    linux读取硬盘命令?,系统,信息,情况,百分比,命令,单位,软件,管理,地址,数据,l

    linux命令超时设置?

    linux命令超时设置?,时间,系统,软件,电脑,服务,资料,中心,网络,管理,状态,lin

    linux下读取文件命令?

    linux下读取文件命令?,系统,工作,地址,数字,图片,信息,网络,命令,文件,一致,l

    linux设置命令行长度?

    linux设置命令行长度?,系统,工作,信息,地址,命令,工具,异常,管理,目录,文件,l

    linux设置代替命令?

    linux设置代替命令?,系统,地址,网络,工作,软件,工具,服务,信息,命令,别名,lin

    linux命令设置时区?

    linux命令设置时区?,时间,系统,国家,大陆,命令,时区,时钟,日期,指令,时分,lin

    linux显卡设置命令?

    linux显卡设置命令?,管理,官方网站,官网,系统,信息,电脑,地址,地方,平台,数

    linux设置命令限制?

    linux设置命令限制?,数字,情况,信息,管理,系统,最新,在线,设备,第一,发行,Lin

    linux设置日志命令行?

    linux设置日志命令行?,异常,系统,实时,日志,管理,信息,对比,项目,名称,情况,L

    linux命令设置日期?

    linux命令设置日期?,时间,系统,命令,服务,大陆,信息,国家,时钟,终端,日期,详

    linux命令行设置网卡?

    linux命令行设置网卡?,系统,地址,信息,网络,工具,电脑,工作,名称,设备,网卡,l

    linux命令优先级设置?

    linux命令优先级设置?,系统,时间,实时,策略,优先级,分时,管理,周期性,进程,

    linux设置ip命令?

    linux设置ip命令?,地址,系统,密码,设备,命令,服务,工具,网络,网卡,计算机,在L

    linux设置命令是什么?

    linux设置命令是什么?,系统,工作,信息,名称,地址,命令,在线,基础,标准,工具,l

    linux命令设置密码?

    linux命令设置密码?,密码,系统,服务,软件,地址,电脑,流程,管理,用户,命令,问

    linux设置编码命令?

    linux设置编码命令?,系统,数据,发展,文件,字符集,命令,数据库,以下,终端,大

    linux命令行设置语言?

    linux命令行设置语言?,系统,管理,环境,国家,工具,电脑,软件,文化,底部,语言,l

    linux设置壁纸的命令?

    linux设置壁纸的命令?,图片,系统,电脑,照片,位置,终端,颜色,字体,单击,壁纸,

    linux恢复命令行设置?

    linux恢复命令行设置?,系统,工作,密码,信息,工具,地址,电脑,命令,情况,地方,