На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> HTTPURLConnection: Connection reset by peer
    Всем привет! Опять я:)

    Не знаю, на сколько это перспективная тема, но попробую озвучить вопрос. Все то же приложение для заказа такси. Сейчас работаю над стартовой деятельностью, задачей которой является выполнение авторизации на сервере. В случае успеха открывается форма заказа, в случае, если сервер говорит нопасаран, должна открываться форма для регистрации (возможна перерегистрация). В случае же сетевого недоразумения появляется AlertDialog, который предлагает попробовать соединиться еще раз, либо выйти из программы. Сегодня долго гонял эту стартовую форму и этот самый диалог. Проблема в том, что если за первую же попытку соединение не состоялось (выдергивал сетевой кабель из ноута, интернет на телефон раздаю с ноута по WiFi), то потом, когда я кабедь втыкаю, сетевые соединения в Windows воскресаю, моей программе на смартфоне все никак не удается подключиться. Везло очень редкие разы, а несколько раз так и не дождался, когда счастье соединиться с сервером привалит - все скачет этот диалог, предлагающий повторить. При этом пробовал параллельно ходить в интернет другими программами - браузером, GMail, YouTube, у них все ок.

    Что-то сразу не догадался вывести реальное сообщение об ошибке. Когда сделал, оказалось Connection reset by peer. Вот кусок кода, отвечающий за обмен с сервером:

    ExpandedWrap disabled
      new Thread(new Runnable()
              {
                  public void run()
                  {
              
                      try
                      {
                          // Откроем страницу для отправки данных
                          URL url = new URL("http://бла-бла-бла.php");
                          HttpURLConnection conn = (HttpURLConnection)url.openConnection();
       
                          // устанавливаем метод POST
                          conn.setRequestMethod("POST");
       
                          // запрещаем кэширование
                          conn.setUseCaches(false);
       
                          // полудуплексный режим обмена
                          conn.setDoOutput(true);
                          conn.setDoInput(true);
       
                          conn.setConnectTimeout(30000);
                          
                          // Зададим разделитель
                          conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundry);
       
                          conn.setRequestProperty("Content-Length", String.valueOf(requestBody.toString().length()));
       
                          // Send the body
                          DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
                          dataOS.writeBytes(requestBody.toString());
                          dataOS.flush();
                          dataOS.close();
       
                          // Получим код ответа
                          if (conn.getResponseCode() == 200)
                          {
                              // Прочитаем ответ сервера
                              BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "windows-1251"));
                              String line;
                              final StringBuffer buf = new StringBuffer();
                              while ((line = rd.readLine()) != null)
                              {
                                  buf.append(line + "\r\n");
                              }
                              
                              // Вызовем обрабочик в дочернем классе
                              onSuccess(buf.toString().trim());
                          }
                          else
                          {
                              onError("");
                          }
                      }
                      catch (Exception e)
                      {
                          onError(e.getMessage());
                      }
                  }
              }).start();


    Как это вылечить?

    Добавлено
    P.S. Тело запроса как StringBuffer requestBody формируется до этого, во всех поптыках очевидно правильное (проверял, выводя его в этом же сообщении), разницы между для первого и последующих запросов в нем нет никакой. Если изначально сеть есть, то подключается без проблем. Но! Несколько раз та же ошибка выводилась, когда я нажимал Отмена в диалоге, приложение закрывалось, я его запускал тут же снова. Прочухалось только после того, как я через приложение YouTube открыл новый ролик. Чем YouTube круче?:)
      имхо, может проблема в том, что не сделан disconnect в обязательном порядке, даже после ошибки?

      ExpandedWrap disabled
        URL url = new URL("http://www.android.com/");
           HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
           try {
             InputStream in = new BufferedInputStream(urlConnection.getInputStream());
             readStream(in);
            finally {
             urlConnection.disconnect();
           }
         }


      Добавлено
      поток у Вас крутиться постоянно или перезапускается?
        Цитата micro @
        поток у Вас крутиться постоянно или перезапускается?
        Ну Вы же видите код: new Thread(...).start(). Создаваемый поток просто не может быть повторно использован.

        Насчет disconnect() подумаю, но не уверен, что решит проблему.

        Добавлено
        Попробовал disconnect(). Ничего не изменилось. Но лучше все-таки такую инструкцию иметь, а то получается, что у меня ни одно соединение не закрывается.

        Где-то, наверно, на StackOverflow видел похожую тему, но, к сожалению, закрыл ее после ознакомления и не сохранил ссылку. Попробую через журнал поискать. Там тоже говорилось о подобной проблеме с интернет по WiFI и озвучивалось, что иногда для такого интернета требуется что-то вроде sign in, что может быть выполнено в браузере, поэтому рекомендовалось вывести соответствующее сообщение пользователю, чтобы он сам "разморозил" интернет, открыв какую-нибудь страницу в браузере. Перед этим делается проверка - если доменное имя получается при соединении не такое, какое мы запрашиваем, значит, произошел редирект, имеем именно такую ситуацию.
          http://www.sql.ru/forum/actualthread.aspx?tid=284608

          Добавлено
          По коду я увидел, что у Вас создается новый поток и сразу запускается.

          Просто было не понятно, в каком контексте все работает.

          Придумал себе, что всегда создается новый, пока не будет достигнута авторизация.
            Цитата micro @

            К чему это? Совсем из другой оперы.
              сам не знаю ;) , моё ведь дело подсказать, а не решить вопрос ).

              Речь была не об этой статье на stackoverflow?
              stackoverflow
                Цитата micro @
                Речь была не об этой статье на stackoverflow?

                Нет, не об этой. Что-то мне так и не удалось найти то, что видел вот ночью:( Весь журнал FF облазил, все что-то не то. Но возможно, я видел ту заметку и на другом ресурсе.
                  запость пожалуйста дамп exception-a :) , мне просто сложно въехать, как работаешь с потоком.

                  Добавлено
                  This error indicates that the remote side has closed the connection while your side was still trying to read from it. You should check if

                  there is a problem on the server (check it's logs) or
                  you are trying to read more data than the server supplies
                    А что тут въезжать? Все же по коду ясно. Поток создается с помощью Runnable и тут же запускается. Никаких ссылок на него не куда не передается, код я привел полный. onSuccess() и onError() - это методы из дочернего класса, в которых определены действия в случае успеха или ошибки соединения и обмена данными. Никаких действий с потоком в них не производится.

                    Дамп сейчас попробую сделать.

                    Добавлено
                    Э, а как я его тебе сделаю? У меня exception ловится. А сейчас вот попробовал, с второй или третьей где-то попытки соединение прошло. Не знаю, почему так, я только добавил disconnect().
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0351 ]   [ 15 queries used ]   [ Generated: 3.05.24, 18:06 GMT ]