连接在AsyncTask上超时

时间:2012-11-26 18:40:48

标签: php android apache android-asynctask

我在对服务器的远程服务器调用中遇到以下异常。

java.net.SocketException: Connection timed out
java.net.SocketTimeoutException: Connection timed out
java.net.ConnectException: failed to connect to www.my_url.com/my_ip (port 80): connect failed: ETIMEDOUT (Connection timed out)

我的服务器已启动,但我猜有一小部分时间由于某种原因它没有响应。

如何解释这些例外情况?它们每隔一段时间都是正常的,或者是一种常见的修复方式,可以在服务器超时之前与服务器保持更长的连接时间吗?

我的服务器是运行PHP的Apache。

提前感谢您的建议。

2 个答案:

答案 0 :(得分:4)

这些错误对于访问互联网的应用来说非常正常。

但是,您可以尝试通过更改HTTP请求的超时值来减少它们的发生,如下所示:

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);

如果您要设置任何现有HTTPClient的参数(例如DefaultHttpClientAndroidHttpClient),您可以使用setParams()函数。

httpClient.setParams(httpParameters);

答案 1 :(得分:3)

除了提示用户某些东西不起作用并稍后再试,将其记录下来进行取证,并希望它们不那么频繁之外,客户端上除此之外没有什么可以做的。但是,我怀疑你的服务器由于多种原因没有响应,你可以做些什么。

在发生此类超时时检查服务器的负载。运行顶部,看看是什么在吃CPU。如果您正在运行后台作业或应用程序上的负载很高。如果你有一个后台工作占用CPU,那么你需要分析你的代码并找到算法运行的热点并改进它。如果您遇到负载问题或无法真正改进代码,那么您需要扩展服务器:更快的服务器,获得更多内存,部署缓存,更快的数据库,运行Quercus(比C PHP提高4倍)。或者使用负载均衡器获得更多服务器并水平扩展。后者很大程度上取决于应用程序的体系结构,但这是你可以解决的问题。