在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();
}