web-dev-qa-db-fra.com

Obtention de Java.net.SocketTimeoutException: la connexion a expiré dans android

Je suis relativement nouveau dans le développement Android. Je développe une application Android où j'envoie une demande au serveur Web et analyse des objets JSON. Souvent, je reçois une exception Java.net.SocketTimeoutException: Connection timed out lors de la communication avec le serveur. Parfois, cela fonctionnera parfaitement sans aucun problème ..__ Je sais que cette même question a été posée à plusieurs reprises dans SO Mais je n'ai toujours pas eu de solution satisfaisante à ce problème. Je publie mon code de communication logcat et serveur d'application ci-dessous.

public JSONObject RequestWithHttpUrlConn(String _url, String param){

    HttpURLConnection con = null;
    URL url;
    String response = "";
    Scanner inStream = null;
    PrintWriter out = null;
    try {
        url = new URL(_url);
        con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(true);
        con.setRequestMethod("POST");
        if(param != null){
            con.setFixedLengthStreamingMode(param.getBytes().length);
        }
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        out = new PrintWriter(con.getOutputStream());
        if(param != null){
            out.print(param);
        }
        out.flush();
        out.close();
        inStream = new Scanner(con.getInputStream());

        while(inStream.hasNextLine()){
            response+=(inStream.nextLine());
        }
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{
        if(con != null){
            con.disconnect();
        }if(inStream != null){
            inStream.close();
        }if(out != null){
            out.flush();
            out.close();
        }
    }
}

Logcat:

03-25 10:55:32.613: W/System.err(18868): Java.net.SocketTimeoutException: Connection 
timed out
03-25 10:55:32.617: W/System.err(18868):at org.Apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
03-25 10:55:32.617: W/System.err(18868):at dalvik.system.BlockGuard
$WrappedNetworkSystem.connect(BlockGuard.Java:357)
03-25 10:55:32.617: W/System.err(18868):at 
org.Apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.Java:204)
03-25 10:55:32.617: W/System.err(18868):at 
org.Apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.Java:437)
03-25 10:55:32.617: W/System.err(18868):at        Java.net.Socket.connect(Socket.Java:1002)
03-25 10:55:32.621: W/System.err(18868):at 
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>
(HttpConnection.Java:75)
03-25 10:55:32.621: W/System.err(18868): at 
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>
(HttpConnection.Java:48)03-25 10:55:32.624: W/System.err(18868):at 
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect
(HttpConnection.Java:322)03-25 10:55:32.624: W/System.err(18868):at 
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get
(HttpConnectionPool.Java:89)03-25 10:55:32.628: W/System.err(18868):at 
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpCon
nection(HttpURLConnectionImpl.Java:285)
03-25 10:55:32.628: W/System.err(18868):at     org.Apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConn
ection(HttpURLConnectionImpl.Java:267)
03-25 10:55:32.636: W/System.err(18868):at
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect
(HttpURLConnectionImpl.Java:205)
03-25 10:55:32.636: W/System.err(18868):at 
org.Apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputS
tream(HttpURLConnectionImpl.Java:614)
03-25 10:55:32.636: W/System.err(18868):at 
com.myapp.core.JSONRequest.RequestWithHttpUrlConn(JSONRequest.Java:63)
03-25 10:55:32.636: W/System.err(18868):    at com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.Java:265)
03-25 10:55:32.640: W/System.err(18868):    at com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.Java:1)
03-25 10:55:32.640: W/System.err(18868):    at Android.os.AsyncTask$2.call
(AsyncTask.Java:185)
03-25 10:55:32.640: W/System.err(18868):    at Java.util.concurrent.FutureTask
$Sync.innerRun(FutureTask.Java:306)
03-25 10:55:32.640: W/System.err(18868):    at Java.util.concurrent.FutureTask.run
(FutureTask.Java:138)
03-25 10:55:32.640: W/System.err(18868):    at 
Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1088)
03-25 10:55:32.648: W/System.err(18868):    at 
Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:581)
03-25 10:55:32.648: W/System.err(18868):    at Java.lang.Thread.run(Thread.Java:1019)
03-25 10:55:32.652: E/JSON Parser(18868): Error parsing data org.json.JSONException:  
End of input at character 0 of 

Quelqu'un peut-il m'aider à trouver une solution à cela? Merci d'avance....

61
akh

J'ai effectué des recherches sur le Web et, après avoir lu beaucoup de documents sur l'exception relative au délai d'attente de connexion, ce que j'ai compris est que la prévention de l'exception SocketTimeoutException dépasse notre limite ... Une façon de le gérer efficacement est de définir un délai d'attente de connexion et un traitement ultérieur en utilisant un bloc de capture d’essai… espérons que cela aidera à l’avenir tous ceux qui sont confrontés au même problème.

HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(7000); //set the timeout in milliseconds
49
akh

Je sais que cette question est un peu vieille. Mais comme je suis tombé sur cela en faisant des recherches, j'ai pensé qu'un petit ajout pourrait être utile.

Comme indiqué, l'erreur ne peut pas être résolue par le client, car il s'agit d'un problème lié au réseau. Cependant, vous pouvez essayer de vous connecter plusieurs fois. Cela peut fonctionner comme une solution de contournement jusqu'à ce que le problème réel soit résolu.

for (int retries = 0; retries < 3; retries++) {
    try {
        final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null);
        final HttpResponse response = client.execute(get);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != 200) {
            throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
        } else {                
            return response.getEntity();
        }
    } catch (final Java.net.SocketTimeoutException e) {
        // connection timed out...let's try again                
    }
}

Peut-être que cela aide quelqu'un.

22
Makenshi

Si vous testez le serveur dans localhost, votre appareil Android doit être connecté au même réseau local. Ensuite, l'URL du serveur utilisé par votre APP doit inclure l'adresse IP de votre ordinateur et non le masque "localhost".

2
xetiro

J'ai eu cette même erreur car j'ai changé par erreur l'ordre des déclarations 

OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(20, TimeUnit.SECONDS).readTimeout(20,TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS) .build();

Après avoir modifié l'ordre des commandes writeTimeout et readTimeout, l'erreur a été résolue . Le code final que j'ai utilisé est donné ci-dessous:

OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)
                    .writeTimeout(60, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .build();
1
jack

Définir ceci dans l'objet OkHttpClient.Builder ()

val httpClient = OkHttpClient.Builder()
        httpClient.connectTimeout(5, TimeUnit.MINUTES) // connect timeout
            .writeTimeout(5, TimeUnit.MINUTES) // write timeout
            .readTimeout(5, TimeUnit.MINUTES) // read timeout
1
Bhojaviya Sagar

Je faisais face à ce problème et la solution a été de redémarrer mon modem (routeur). Je pourrais obtenir la connexion de mon application à Internet après cela.

Je pense que la bibliothèque que j'utilise ne gère pas les connexions correctement car elle survient à quelques reprises.

0
Gian Gomen