Подтвердить что ты не робот

Получение "SocketException: подключение reset by peer" в Android

Моему приложению нужно связаться с тем же устройством, на котором он работает, через http://127.0.0.1/... (URL-адрес localhost).

По какой-то причине примерно в 50% случаев (и, может быть, ровно 50%), когда я попадаю на сайт с содержимым JSON, я получаю исключение:

java.net.SocketException: recvfrom failed: ECONNRESET (соединение reset одноранговым узлом)

Для остальных 50% я получаю отличные результаты. Я пытался делать опросы (и даже большую задержку между опросами), но я продолжаю получать такие же странные результаты.

Я искал в Интернете, а также здесь, и я не уверен, почему это происходит. Значит ли это, что клиент вызвал это? Почему это происходит, и как я должен справиться с этим?

Некоторые веб-сайты говорят, что это обычная вещь, но я не нашел, что лучше делать в таких случаях.

4b9b3361

Ответ 1

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

Возможно, Android поддерживает пул соединений и использует старый или что-то в этом роде.

В любом случае, теперь это работает.


EDIT: согласно API HttpURLConnection, это также можно решить на стороне клиента:

Потоки ввода и вывода, возвращаемые этим классом, не буферизуются. Большинство вызывающих абонентов должны обертывать возвращенные потоки с помощью BufferedInputStream или BufferedOutputStream. Абоненты, которые выполняют только объемные операции чтения или записи, могут опустить буферизацию. При передаче больших объемов данных в или из сервер, используйте потоки, чтобы ограничить количество данных в памяти сразу. Если вам не нужно, чтобы все тело было в памяти сразу, обработайте его как поток (вместо сохранения полного тела в виде одного байтового массива или строка).

Чтобы уменьшить задержку, этот класс может повторно использовать один и тот же основной Socket для несколько пар запросов/ответов. В результате HTTP-соединения могут быть открытые дольше, чем необходимо. Вызовы для отключения() могут возвращать сокет в пул подключенных сокетов. Такое поведение можно отключить установив для системного свойства http.keepAlive значение false до выдачи любые HTTP-запросы. Свойство http.maxConnections может использоваться для контролировать количество простоя подключений к каждому серверу.

Взято из: developer.android.com/reference/java/net/HttpURLConnection.html

Ответ 2

Попробуйте установить это свойство для HttpURLConnection перед подключением:

conn.setRequestProperty("connection", "close");

Это отключит свойство keep-alive, которое включено по умолчанию.

Ответ 3

Это старый поток, который я знаю. Но это может помочь кому-то.

В моем случае эта ошибка была вызвана службой .NET WCF (soap). Один из объектов возвращаемого результата имел свойство DataMember с атрибутом get {}, но не свойство set {}.

Для сериализации каждый DataMember должен иметь как {{}, так и {{} доступный. Я выполнил пустой набор {} (пустой из-за моих бизнес-правил), и проблема была решена.

Мой scenerio - это конкретная неудачная реализация сервера, но, возможно, это поможет кому-то сэкономить время при устранении неполадок.

Ответ 4

У меня было много этих Connection reset by peer, когда я посещал определенные веб-страницы или загружал файлы (из своего приложения или в браузер Android).

Оказалось, что моя 3G-несущая блокировала подключения (например, загрузка файла .exe была запрещена).

У вас такая же проблема на Wi-Fi?

Ответ 6

Это исключение просто возникает при отключении Wi-Fi или отключении передачи данных, поэтому приложение не может подключиться к серверу.