【发布时间】:2015-07-22 10:37:28
【问题描述】:
我已经挖掘了很长一段时间,我想知道如何在 Java (Android) 中打开一个 HttpClient 连接,然后在我检查网络监控工具时立即关闭套接字而不会获得 CLOSE_WAIT 和 TIME_WAIT TCP 状态.
我正在做的是(在 stackoverflow 网站上找到了这个解决方案):
String url = "http://example.com/myfile.php";
String result = null;
InputStream is = null;
StringBuilder sb = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection" + e.toString());
}
// convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
}
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
运行此代码后 - PHP 文件执行良好,我得到了 TOAST 的响应,但是 - 当我使用外部网络分析器工具分析移动设备的网络环境时 - 我看到连接停留在 CLOSE_WAIT 或/和 TIME_WAIT 大约 1 分钟,然后才进入 CLOSED 状态。
问题是: 我在无限循环中每隔约 2 到 5 秒调用一次上述函数,随着时间的推移会导致大量的 CLOSE_WAIT 和 TIME_WAIT - 这会影响我的 Android 应用程序的整体性能,直到它卡住并且无用!
我想要做的是(如果可能的话需要你的回答): 我希望在没有任何打开的套接字的情况下 TOAST 响应消息后立即关闭连接。没有 TIME_WAIT 也没有 CLOSE_WAIT。完全没有剩余 - 在我运行应该这样做的代码的瞬间关闭所有通信。在循环的下一次迭代之前,我不再需要连接。
我怎样才能做到这一点? 我记得我不希望应用程序随着时间的推移停止或性能不佳,因为它应该在服务中运行/永远保持打开状态。
如果您能在我完成复制粘贴后编写简单的代码,我将不胜感激。 我是 Java 和 Android 的新手,所以我会试着弄清楚你写的代码,所以请尽可能简单。非常感谢!
提问者。
【问题讨论】:
-
你试过了吗:httpClient.getConnectionManager().shutdown();
-
嗨菲利普,是的,我做到了。我尝试了 .shutdown 并尝试了 .close() - 全部留下 CLOSE_WAIT/TIME_WAIT 的痕迹大约一分钟或更长时间。由于我需要每隔几秒钟循环运行一次此代码 - 我遇到了上面提到的问题。
标签: java android sockets httpclient