精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>源码收藏>>彻底解决URLConnection没有超时问题

主题:彻底解决URLConnection没有超时问题
发信人: webpk(蒸的英雄)
整理人: zjxyz(2002-09-10 10:22:16), 站内信件
由于URLConnection没有超时控制,客户端无法控制连接超时后从服务器断开。研究了sun.net包后,发现所有的Handler类(http, ftp ,nntp)等的Socket都是从sun.net.NetworkClient类中得到的。因此修改sun.net.NetworkClient类后可以解决所有的socket没有超时的问题。下面是源程序: 
package sun.net; 

import java.io.*; 
import java.net.Socket; 
import java.net.UnknownHostException; 

/** 
 * 增强原来NetworkClient的功能, 增加超时功能. 超时从System的property中读取. 
 * property的名字为urlconnection.timeout 
 * 
 */ 
public class NetworkClient 


  public void openServer(String s, int i) 
      throws IOException, UnknownHostException { 
    if(serverSocket != null) 
      closeServer(); 
    serverSocket = doConnect(s, i); 
    serverOutput = new PrintStream( 
      new BufferedOutputStream(serverSocket.getOutputStream()), true); 
    serverInput = new BufferedInputStream(serverSocket.getInputStream()); 
  } 

  protected Socket doConnect(String s, int i) 
      throws IOException, UnknownHostException { 
    Socket so = new Socket(s,i); 
    String timeout = System.getProperty("http.socketTimeout"); 
    if(timeout!=null) { 
      int to; 
      try { 
        to = Integer.parseInt(timeout); 
      }catch(NumberFormatException ex) { 
        to = 900000; 
      } 
      so.setSoTimeout(to); 
      //System.out.println("Timeout: "+timeout); 
    } 
    return so; 
  } 

  public void closeServer() 
    throws IOException 
  { 
    if(!serverIsOpen()) 
    { 
      return; 
    } else 
    { 
      serverSocket.close(); 
      serverSocket = null; 
      serverInput = null; 
      serverOutput = null; 
      return; 
    } 
  } 

  public boolean serverIsOpen() 
  { 
    return serverSocket != null; 
  } 

  public NetworkClient(String s, int i) 
    throws IOException 
  { 
    serverSocket = null; 
    openServer(s, i); 
  } 

  public NetworkClient() 
  { 
    serverSocket = null; 
  } 

  protected Socket serverSocket; 
  public PrintStream serverOutput; 
  public InputStream serverInput; 


然后用jar将上面的class打成sun_net.jar包。 
为了让sun.net起作用需要在启动你的程序时加上以下参数: 
java -Xbootclasspath/p:"sun_net.jar" -Dhttp.socketTimeout=3000 


(转自xici)

[关闭][返回]