Получение «SocketException: соединение с помощью peer» в Android

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

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

Java.net.SocketException: recvfrom failed: ECONNRESET (сброс соединения с помощью одноранговой сети)

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

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

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

Solutions Collecting From Web of "Получение «SocketException: соединение с помощью peer» в Android"

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

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

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


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

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

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

Снято с: developer.android.com/reference/java/net/HttpURLConnection.html

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

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

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

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

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

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

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

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

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

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

System.setProperty ("http.keepAlive", "false");

В этой ссылке HTTP-соединения описаны подробно. Попробуйте эту ссылку (1498 + ves):

Использование java.net.URLConnection для запуска и обработки HTTP-запросов

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