Получение "SocketException: подключение reset by peer" в Android
Моему приложению нужно связаться с тем же устройством, на котором он работает, через http://127.0.0.1/...
(URL-адрес localhost).
По какой-то причине примерно в 50% случаев (и, может быть, ровно 50%), когда я попадаю на сайт с содержимым JSON, я получаю исключение:
java.net.SocketException: recvfrom failed: ECONNRESET (соединение reset одноранговым узлом)
Для остальных 50% я получаю отличные результаты. Я пытался делать опросы (и даже большую задержку между опросами), но я продолжаю получать такие же странные результаты.
Я искал в Интернете, а также здесь, и я не уверен, почему это происходит. Значит ли это, что клиент вызвал это? Почему это происходит, и как я должен справиться с этим?
Некоторые веб-сайты говорят, что это обычная вещь, но я не нашел, что лучше делать в таких случаях.
Ответы
Ответ 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?
Ответ 5
В этой ссылке HTTP-соединения описаны подробно. Попробуйте эту ссылку (1498 + ves):
Использование java.net.URLConnection для запуска и обработки HTTP-запросов
Ответ 6
Это исключение просто возникает при отключении Wi-Fi или отключении передачи данных, поэтому приложение не может подключиться к серверу.