Ich bin relativ neu in der Android-Entwicklung. Ich entwickle eine Android-Anwendung, in der ich eine Anfrage an den Webserver sende und JSON-Objekte analysiere. Häufig erhalte ich java.net.SocketTimeoutException: Connection timed out
bei der Kommunikation mit dem Server eine Ausnahme. Manchmal funktioniert es problemlos. Ich weiß, dass dieselbe Frage so oft gestellt wurde. Trotzdem habe ich keine zufriedenstellende Lösung für dieses Problem gefunden. Ich poste unten meinen Logcat- und App-Server-Kommunikationscode.
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
Kann mir jemand helfen, eine Lösung dafür zu finden? Danke im Voraus....
Antworten:
Ich habe im gesamten Web gesucht und nachdem ich viele Dokumente zu Ausnahmebedingungen für das Verbindungszeitlimit gelesen habe, habe ich verstanden, dass die Verhinderung von SocketTimeoutException über unserer Grenze liegt ... Eine Möglichkeit, dies effektiv zu handhaben, besteht darin, ein Verbindungszeitlimit und eine spätere Behandlung zu definieren Ich hoffe, dies hilft jedem, der in Zukunft mit dem gleichen Problem konfrontiert ist.
HttpUrlConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(7000); //set the timeout in milliseconds
quelle
20 * 1000
SocketTimeOutException" eingestellt.Mir ist bewusst, dass diese Frage etwas alt ist. Aber da ich bei meinen Recherchen darauf gestoßen bin, dachte ich, eine kleine Ergänzung könnte hilfreich sein.
Wie bereits erwähnt, kann der Fehler vom Client nicht behoben werden, da es sich um ein Netzwerkproblem handelt. Sie können jedoch versuchen, die Verbindung einige Male erneut herzustellen. Dies kann als Problemumgehung dienen, bis das eigentliche Problem behoben ist.
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 } }
Vielleicht hilft das jemandem.
quelle
Wenn Sie den Server in localhost testen, muss Ihr Android-Gerät mit demselben lokalen Netzwerk verbunden sein. Dann muss die von Ihrer APP verwendete Server-URL die IP-Adresse Ihres Computers und nicht die Maske "localhost" enthalten.
quelle
Wenn Sie Kotlin + Retrofit + Coroutines verwenden, verwenden Sie einfach
try
undcatch
für Netzwerkoperationen wie:viewModelScope.launch(Dispatchers.IO) { try { val userListResponseModel = apiEndPointsInterface.usersList() returnusersList(userListResponseModel) } catch (e: Exception) { e.printStackTrace() } }
Wo, Ausnahme ist Art von
kotlin
und nicht vonjava.lang
Dies behandelt jede Ausnahme wie:
Hier ist meine
usersList()
Funktion@GET(AppConstants.APIEndPoints.HOME_CONTENT) suspend fun usersList(): UserListResponseModel
Hinweis: Ihre RetrofitClient-Klassen müssen dies als haben
client
OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS)
quelle
Ich hatte dieses Problem und die Lösung bestand darin, mein Modem (Router) neu zu starten. Danach könnte ich eine Verbindung für meine App zum Internet herstellen.
Ich denke, die Bibliothek, die ich benutze, verwaltet Verbindungen nicht richtig, weil sie nur wenige Male passiert.
quelle
Legen Sie dies im OkHttpClient.Builder () -Objekt fest
val httpClient = OkHttpClient.Builder() httpClient.connectTimeout(5, TimeUnit.MINUTES) // connect timeout .writeTimeout(5, TimeUnit.MINUTES) // write timeout .readTimeout(5, TimeUnit.MINUTES) // read timeout
quelle
Ich habe den gleichen Fehler erhalten, als ich versehentlich die Reihenfolge der Anweisungen geändert habe
OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(20, TimeUnit.SECONDS).readTimeout(20,TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS) .build();
Nach dem Ändern der Reihenfolge von writeTimeout und readTimeout wurde der Fehler behoben. Der endgültige Code, den ich verwendet habe, ist unten angegeben:
OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build();
quelle
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(); } } }
quelle