HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
执行上面这句会堵塞,该怎么强制取消掉?
我用connection.disconnect(); 和 connection == null 都无法将其终止和强制异常.
大家都是怎么解决网络连接取消的问题?

解决方案 »

  1.   

    setReadTimeout
    public void setReadTimeout(int timeout)将读超时设置为指定的超时,以毫秒为单位。用一个非零值指定在建立到资源的连接后从 Input 流读入时的超时时间。如果在数据可读取之前超时期满,则会引发一个 java.net.SocketTimeoutException。超时时间为零表示无穷大超时。 
    此方法的一些非标准实现会忽略指定的超时。要查看读入超时设置,请调用 getReadTimeout()。 
    参数:
    timeout - 一个指定要使用的超时值的 int,以毫秒为单位 
    抛出: 
    IllegalArgumentException - 如果超时参数为负
    从以下版本开始: 
    1.5 
    另请参见:
    getReadTimeout(), InputStream.read()
      

  2.   

    openConnection() 的时候还没连呢,只有在 getInputStream 或者 getOutputStream 的时候才会真正去连接。openConnection 的时候应该不会阻塞啊?
      

  3.   


    你说的对,应该getInputStream 或者 getOutputStream 堵塞.就是在这个堵塞期间,我想取消了这次联网请求.2楼说的setReadTimeout在getInputStream 或者 getOutputStream 以后也是无效的.还有别的解决办法吗?
      

  4.   

    刚才测试了一下,网络不好的情况下会堵塞在connection.connect();
      

  5.   

    这是底层TCP/IP协议决定的,只能设定一个超时。换种思路可以解决这种办法:把这个连接放到一个线程里,如果想要取消,直接把这个线程Kill掉就好了
      

  6.   


    这样是不是有点太粗暴了? java不推荐直接kill thread呀.
      

  7.   

    IO操作(包括NET,FILE)一般放在一个新线程中搞是明智的。8L的说法可行
      

  8.   

    diconnect和connect = null 都是释放资源而已,不能强制关掉已存在的连接。其实openconnection 实现的原理还是使用socket,URL连接是Socket打开的TCP连接,预先要经过3次握手,在windows中如果3次握手中有一次握手响应时间超过21秒就会抛出TImeout。 这些底层东西是无法通过java API来进行操作的。你只能预先设定一个超时,一旦开始连接,就是TCP/IP协议的操作了 ,JVM是插手不上了。所以,你只能把你当前运行的JVM进程终止,这个被阻塞的连接才会终止。 但是从你应用角度来说,好像你是希望解决阻塞问题。阻塞问题,可以两种方法解决:一种是多线程,还有就是异步模式了。HttpURLConnection实现的功能过于简单,你可以下载Apache的一个HttpClient,它的功能和机制比HttpURLConnection强大很多
      
      

  9.   

    不好意思,忘记补上一点了,我上面指的连接 是:与目标服务器握手建立连接的过程。 一旦TCP握手连接成功后,关闭打开的输入输出流就可以关闭这个连接了。(楼主的问题应该就是:阻塞在与目标服务器建立连接的过程了)
      

  10.   

    我是想封装一个网络连接类,有没有好的办法解决connect堵塞时进行强制取消该连接呢?