Java.net.SocketTimeoutException ophalen: verbinding verbroken in Android

Ik ben relatief nieuw op het gebied van Android-ontwikkeling. Ik ontwikkel een Android-applicatie waarbij ik verzoeken naar de webserver stuur en JSON-objecten parseer. Regelmatig krijg ik java.net.SocketTimeoutException: Connection timed outuitzondering tijdens communicatie met de server. Soms zal het perfect werken zonder enig probleem.
Ik weet dat dezelfde vraag al zo vaak is gesteld. Maar toch kreeg ik geen bevredigende oplossing voor dit probleem. Ik post mijn logcat en app-server communicatiecode hieronder.

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 

Kan iemand mij helpen om hier een oplossing voor te vinden? Bij voorbaat dank….


Antwoord 1, autoriteit 100%

Ik heb het hele internet doorzocht en na het lezen van veel documenten met betrekking tot de uitzondering van de verbinding time-out, is het ding dat ik begreep dat, het voorkomen van SocketTimeoutExceptionvoorbij onze limiet ligt. Een manier om het effectief aan te pakken is om een ​​aansluittime-out te definiëren en later aan te gaan met behulp van een try-catchblok. Ik hoop dat dit iedereen in de toekomst zal helpen die tegenover hetzelfde probleem staan.

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

Antwoord 2, Autoriteit 43%

Ik weet dat deze vraag een beetje oud is. Maar aangezien ik hierheen struikelde terwijl ik onderzoek heb gedaan, dacht ik dat een kleine toevoeging nuttig zou kunnen zijn.

Zoals vermeld, kan de fout niet door de klant worden opgelost, omdat het een netwerkgerelateerd probleem is. Wat u kunt doen is echter opnieuw proberen met het verbinden van een paar keer. Dit kan werken als een oplossing totdat het echte probleem is vastgesteld.

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                
    }
}

Misschien helpt dit iemand.


Antwoord 3, Autoriteit 6%

Als u Kotlin + Retrofit + Coroutinesgebruikt, gebruik dan gewoon tryen catchvoor netwerkbewerkingen zoals,

viewModelScope.launch(Dispatchers.IO) {
        try {
            val userListResponseModel = apiEndPointsInterface.usersList()
            returnusersList(userListResponseModel)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

Waar, Uitzondering is het type kotlinen niet van java.lang

Dit behandelt elke uitzondering zoals,

  1. HttpException
  2. SocketTimeoutException
  3. FATAL UITZONDERING: DefaultDispatcher etc

Hier is mijn functie usersList()

@GET(AppConstants.APIEndPoints.HOME_CONTENT)
suspend fun usersList(): UserListResponseModel

Opmerking:
Uw RetrofitClient-klassen moeten dit hebben als client

OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)

Antwoord 4, autoriteit 3%

Als u de server in localhost test, moet uw Android-apparaat verbonden zijn met hetzelfde lokale netwerk. Dan moet de server-URL die door uw APP wordt gebruikt, het IP-adres van uw computer bevatten en niet het “localhost”-masker.


Antwoord 5

Ik had hetzelfde probleem bij het verbinden met EC2, het probleem was met Security Group,
Ik heb het opgelost door de toegestane IP’s toe te voegen aan poort 5432


Antwoord 6

Ik had dit probleem en de oplossing was om mijn modem (router) opnieuw op te starten. Daarna kon ik verbinding krijgen voor mijn app met internet.

Ik denk dat de bibliotheek die ik gebruik de verbindingen niet goed beheert, omdat het maar een paar keer is gebeurd.


Antwoord 7

Stel dit in in OkHttpClient.Builder() Object

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

Antwoord 8

Voor mij heb ik zojuist mijn applicatie opnieuw opgestart en hij is verdwenen. Als u emulator gebruikt, probeer deze dan opnieuw op te starten. Als u een fysiek apparaat gebruikt, controleer dan of er een internetverbinding is. Probeer het eens!


Antwoord 9

Ik kreeg dezelfde foutmelding omdat ik per ongeluk de volgorde van de uitspraken heb gewijzigd

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

Na het wijzigen van de volgorde van writeTimeout en readTimeout is de fout opgelost.
De uiteindelijke code die ik heb gebruikt wordt hieronder gegeven:

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

Antwoord 10

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

Other episodes