Java HttpClient Raise Error: Connection http://www.xxx.com refused
在 Android 上运行 jar,
目的是从服务器一直获取消息, 使用 HTTP 服务.
但是每次启动进程, 当请求次数达到
1010 时候, 总是会报错:
杀掉进程重新启动, 一切正常,
1000次后又是连接被重置.
检查 HTTP 服务, 用 PC 访问
API 正常, 在 Android 上用浏览器访问, API 也正常. 可以确认服务是正常的, 并不是服务器拒绝连接.
adb shell logcat -c # 清除手机的 log
adb shell logcat
通过手机查看 log, 发现了错误提示:
… -EMFILE (Too many open files) …
原因是: socket连接太多, Android本地拒绝连接服务.
有 httpGet/HttpPost
close()/releaseCollection()
有
httpClient.getConnectionManager()
closeExpiredConnections()/shutdown()
HttpGet
close()/releaseCollection 只是虚函数, 没有实例函数, 并不能用.
正确的方式是
httpClient.getConnectionManager().closeExpiredConnections()
httpClient.getConnectionManager().shutdown()
代码如下
public static String get(String URL, Map params){
String result = "";
String URI = setParams(params);
// System.out.println(URL + "?" + URI);
httpGet = new HttpGet(URL + "?" + URI);
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT);
httpClient.getParams().setLongParameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT);
httpClient.getParams().setLongParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 256);
HttpResponse response = null;
try {
response = httpClient.execute(httpGet);
} catch (Exception e) {
Logger.getLogger(Configure.loggerName).severe(Configure.logTag
+ String.format("[COUNT: %s] Download failed, url: %s, uri:%s error: %s", COUNT, URL, URI, e.getMessage()));
httpClient.getConnectionManager().closeExpiredConnections();
httpClient.getConnectionManager().shutdown();
//httpGet.close();
//httpGet.releaseConnection();
//e.printStackTrace();
return result;
}
try {
HttpEntity httpEntity = response.getEntity();
InputStream inputStream = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while (null != (line = reader.readLine())) {
result += (line + "\n");
}
// System.out.println(result);
inputStream.close();
reader.close();
httpClient.getConnectionManager().closeExpiredConnections();
httpClient.getConnectionManager().shutdown();
// httpGet.close();
// httpGet.releaseConnection();
} catch (Exception e) {
Logger.getLogger(Configure.loggerName).severe(Configure.logTag
+ String.format("Download read response failed, url: %s error: %s", URL, e.getMessage()));
// e.printStackTrace();
}
return result;
}
参考