连接在AsyncTask上超时

连接在AsyncTask上超时

问题描述:

I get the following exceptions on a remote server call to my server.

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)

My server was up, but I guess there is a small percentage of the time where it is unresponsive for some reason.

How do I interpret these exceptions? Are they all normal every once in a while or, is a common fix to allow for a longer connection time with the server before it times out?

My server is Apache running PHP.

Thanks for suggestions ahead of time.

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

  java.net.SocketException:连接超时
java.net.SocketTimeoutException:连接超时
java.net.ConnectException:无法连接到www.my_url.com/  my_ip(端口80):连接失败:ETIMEDOUT(连接超时) code>  pre> 
 
 

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

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

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

提前感谢您的建议。 p> div>

There's is nothing you can do about these on the client other than prompt the user that something didn't work and try again later, log it for your forensics, and hope they aren't that frequent. However, I suspect your server is not responsive for several reasons and there IS something you can do about it.

Check your server's load when a timeout like this happens. Run top and see what's eating up the CPU. If you have background jobs running or the load on the application is high. If you have a background job eating up the CPU then you need to profile your code and find where the algorithm is running hot and improve it. If you have a load problem or you can't really improve your code then you need to either scale up your server: faster server, get more memory, deploy caching, faster DB, run Quercus (4x improvement over C PHP). Or get more servers and scale horizontally with a load balancer. The later one depends a lot on architecture of your application, but that is something you can fix.

These errors are pretty normal for a app accessing the internet.

However, you could try to reduce their occurrence by changing the timeout values for the HTTP requests, as shown below:

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);

If you want to set the Parameters of any existing HTTPClient (e.g. DefaultHttpClient or AndroidHttpClient) you can use the function setParams().

httpClient.setParams(httpParameters);