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