web-dev-qa-db-ja.com

Java.net.SocketTimeoutExceptionの取得:androidで接続がタイムアウトしました

私はAndroid開発に比較的慣れていません。 Webサーバーにリクエストを送信し、jsonオブジェクトを解析するAndroidアプリケーションを開発しています。サーバーとの通信中に、しばしばJava.net.SocketTimeoutException: Connection timed out例外が発生します。場合によっては問題なく完全に機能することもあります。この同じ質問がSOで何度も聞かれたことを知っています。しかし、それでもこの問題に対する満足のいく解決策は得られませんでした。以下にlogcatとapp-server通信コードを投稿しています。

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 

誰でもこの解決策を見つけるのを手伝ってくれますか?前もって感謝します....

62
akh

私はウェブ全体を検索しましたが、接続タイムアウト例外に関する多くのドキュメントを読んだ後、SocketTimeoutExceptionを防ぐことは制限を超えているということです...効果的にそれを処理する1つの方法は、接続タイムアウトを定義し、後で処理することですtry catchブロックを使用することにより、これが同じ問題に直面している将来の誰にも役立つことを願っています。

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

この質問は少し古いことを知っています。しかし、研究中にこれにつまずいたので、少し追加することが役立つと思いました。

前述のように、エラーはネットワーク関連の問題であるため、クライアントでは解決できません。ただし、できることは、接続を数回再試行することです。これは、実際の問題が修正されるまで回避策として機能する場合があります。

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

たぶんこれは誰かを助ける。

23
Makenshi

Localhostでサーバーをテストする場合は、Androidデバイスを同じローカルネットワークに接続する必要があります。次に、APPが使用するサーバーURLには、「localhost」マスクではなく、コンピューターのIPアドレスを含める必要があります。

2
xetiro

誤ってステートメントの順序を変更したのと同じエラーが発生しました

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

WriteTimeoutとreadTimeoutの順序を変更した後、エラーは解決しました。私が使用した最終的なコードは次のとおりです。

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

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

この問題に直面していましたが、解決策はモデム(ルーター)を再起動することでした。その後、アプリのインターネットへの接続を取得できました。

私が使用しているライブラリは、数回しか動作しないため、接続を適切に管理していないと思います。

0
Gian Gomen