发信人: 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) | 
 
 
 |