简体   繁体   中英

Connection timed out on 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.

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 (eg DefaultHttpClient or AndroidHttpClient ) you can use the function setParams() .

httpClient.setParams(httpParameters);

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM