解决httpclient出现too many open file

在httpclient请求是 如果在某段时间内频繁使用httpclient请求会会出现

java.net.SocketException: Too many open files
	at java.net.Socket.createImpl(Socket.java:397)
	at java.net.Socket.(Socket.java:371)
	at java.net.Socket.(Socket.java:249)
	at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:79)
	at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:121)
	at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:706)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:386)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
	at common.BaseAction.reqGet(BaseAction.java:111)
	at android_interface.classification.ClassificationInterface.getAllFenlei(ClassificationInterface.java:95)


这是因为:

HttpClient建立Socket时 ,method.releaseConnection()并没有真正关闭连接,而是将该连接提交给 MultiThreadedHttpConnectionManager,等待复用。
而http的连接是等待timeout才会自动断开的,所以,当用完系统的句柄后,自然会报Too many open files。

解决方法

method.addRequestHeader( "Connection", "close");
client.getParams().setBooleanParameter( "http.protocol.expect-continue" , false );


HttpClient client = new HttpClient();
		// 设置关闭
		client.getParams().setBooleanParameter( "http.protocol.expect-continue" , false );
		client.getParams().setContentCharset("utf-8");
		HttpMethod method = new GetMethod(url);
		// 设置关闭
		method.addRequestHeader( "Connection", "close");
		try {

			client.executeMethod(method);
			result = method.getResponseBodyAsString();

		} catch (Exception e) {
			log.error(" httpclient 请求 " + url +"异常 " , e);
		}finally{
			method.releaseConnection();
		}  


你可能感兴趣的:(java,httpclient,Socket)