Получение java.net.SocketTimeoutException: время ожидания соединения истекло в Android

Я относительно новичок в разработке Android. Я разрабатываю приложение для Android, в котором я отправляю запросы на веб-сервер и анализирую объекты JSON. Часто я получаю исключение java.net.SocketTimeoutException: Connection timed out при общении с сервером. Иногда это будет работать отлично без каких-либо проблем. Я знаю, что этот же вопрос задавался ТАК много раз. Но, тем не менее, я не получил удовлетворительного решения этой проблемы. Ниже я публикую свой logcat и код связи приложения с сервером.

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

Логкат:

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 

Может ли кто-нибудь помочь мне найти решение для этого? Заранее спасибо....


person akh    schedule 25.03.2013    source источник
comment
Я думаю, что это ваша проблема с сетью   -  person Pragnani    schedule 25.03.2013
comment
Я проверил это на высокоскоростном Wi-Fi ... но это происходит часто ...   -  person akh    schedule 25.03.2013
comment
установить тайм-аут соединения.   -  person Raghunandan    schedule 25.03.2013
comment
@akh: убедитесь, что вы используете правильный URL-адрес веб-службы для отправки запроса httppost или сервер работает   -  person ρяσѕρєя K    schedule 25.03.2013
comment
stackoverflow.com/questions/4577804/   -  person Raghunandan    schedule 25.03.2013
comment
@akh Дело не в скорости соединения, а из-за ответа сервера, попробуйте вызвать тот же URL-адрес из окна браузера и проверьте, сколько времени это займет..   -  person Pragnani    schedule 25.03.2013
comment
@ρяσѕρєяK Осталось 565 до 30к. congs bro.. Я ценю ваш вклад в SO.   -  person Pragnani    schedule 25.03.2013
comment
@Raghunandan Установка времени ожидания соединения не решит проблему времени ожидания соединения.   -  person user207421    schedule 26.03.2013
comment
@EJP, не могли бы вы предложить лучшее решение для установки периода ожидания соединения в залпе?   -  person Pranay Soni    schedule 23.04.2018
comment
В моем случае это происходит, когда API заблокирован, т.е. срок действия хостинга истек. Из всего вышеизложенного. Я думаю, что это происходит, когда проблема с сетью. В вашем коде нет никаких проблем.   -  person Rahul Kushwaha    schedule 18.01.2019


Ответы (9)


Я искал по всему Интернету и, прочитав множество документов об исключении тайм-аута соединения, понял, что предотвращение SocketTimeoutException выходит за наши пределы. Один из способов эффективно справиться с этим — определить время ожидания соединения, а затем обработать его с помощью блока try-catch. Надеюсь, это поможет всем, кто в будущем столкнется с той же проблемой.

HttpUrlConnection conn = (HttpURLConnection) url.openConnection();

//set the timeout in milliseconds
conn.setConnectTimeout(7000);
person akh    schedule 28.03.2013
comment
Изменение периода тайм-аута не является «обработкой». Перехват исключения помогает, но вы уже делали это. Ничто из этого на самом деле не решает проблему, которая является проблемой подключения к сети, а вовсе не проблемой программирования. - person user207421; 31.03.2013
comment
я согласен, что это 100% проблема сети, а не проблема программирования... Под "обработкой" я подразумеваю спасение приложения от сбоя... Все, что я хочу, это выйти из приложения, когда это произойдет..... .и что касается перехвата исключения, раньше я не перехватывал SocketTimeoutException... Поэтому я перехватываю это исключение и выхожу из приложения. - person akh; 03.04.2013
comment
Мое время подключения и readTimeOut установлено на 20 * 1000, все еще получаю исключение SocketTimeOutException! - person Muhammad Babar; 31.12.2015
comment
@MuhammadBabar Это означает, что в сети возникла проблема, из-за которой через 20 секунд не пришел ответ. Вам нужно поймать SocketTimeoutException и соответствующим образом обработать ситуацию. - person akh; 02.01.2016
comment
@akh хорошо, я уже ловлю исключение, и подключение к Интернету тоже в порядке, но все же исключение происходит часто! - person Muhammad Babar; 04.01.2016
comment
@EJP Если увеличение времени ожидания не является решением проблемы, поскольку, как вы упомянули, это проблема с сетью, то какие действия необходимо предпринять для решения этой проблемы? - person Salman; 26.06.2016
comment
я использую модификацию, я установил клиент okhttp и установил как OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) ) .строить(); все еще я получаю ту же проблему? - person Prasad; 05.08.2016

Я знаю, что этот вопрос немного устарел. Но так как я наткнулся на это во время исследования, я подумал, что небольшое дополнение может быть полезным.

Как указано, ошибка не может быть решена клиентом, так как это проблема, связанная с сетью. Однако вы можете повторить попытку подключения несколько раз. Это может работать как обходной путь, пока реальная проблема не будет устранена.

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

Может быть, это кому-то поможет.

person Makenshi    schedule 07.07.2014

Если вы используете Kotlin + Retrofit + Coroutines, просто используйте try и catch для сетевых операций, например:

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

Где Exception имеет тип kotlin, а не java.lang

Это будет обрабатывать каждое исключение, например,

  1. HttpException
  2. SocketTimeoutException
  3. НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: DefaultDispatcher и т. д.

Вот моя функция usersList()

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

Примечание. Ваши классы RetrofitClient должны иметь значение client.

OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
person Kishan Solanki    schedule 08.06.2020

Если вы тестируете сервер на локальном хосте, ваше Android-устройство должно быть подключено к той же локальной сети. Затем URL-адрес сервера, используемый вашим приложением, должен включать IP-адрес вашего компьютера, а не маску «localhost».

person xetiro    schedule 24.07.2015

Я столкнулся с той же проблемой при подключении к EC2, проблема была с группой безопасности, я решил, добавив разрешенные IP-адреса на порт 5432.

person goku    schedule 08.02.2021

Я столкнулся с этой проблемой, и решение состояло в том, чтобы перезапустить мой модем (маршрутизатор). После этого я мог подключить свое приложение к Интернету.

Я думаю, что библиотека, которую я использую, неправильно управляет соединениями, потому что это случалось всего несколько раз.

person jan4co    schedule 17.09.2018

Установите это в объекте 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
person Bhojaviya Sagar    schedule 06.03.2019

Для меня я просто перезапустил свое приложение, и оно исчезло. Если вы используете эмулятор, попробуйте перезапустить его. Если вы используете физическое устройство, проверьте подключение к Интернету. Попробуйте!

person Parthan_akon    schedule 25.05.2021

Я получил ту же ошибку, так как по ошибке изменил порядок операторов

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();
person jack    schedule 03.12.2018
comment
Изменение порядка не должно было иметь значения, поскольку все, что он делает, это устанавливает внутренние поля, а затем создает объект. - person dvallejo; 13.07.2019