Получение "SocketException: сброс соединения по пиру" в Android
Мое приложение должно связаться с тем же устройством, на котором оно работает, через http://127.0.0.1/...
(локальный URL).
По какой-то причине, примерно в 50% случаев (и, может быть, точно в 50%), когда я захожу на веб-сайт с содержимым JSON, я получаю исключение:
java.net.SocketException: recvfrom не удалось: ECONNRESET (соединение сбрасывается одноранговым узлом)
Для остальных 50% я получаю совершенно хорошие результаты. Я пытался делать опросы (и даже большую задержку между опросами), но я продолжаю получать те же странные результаты.
Я искал в Интернете, а также здесь, и я не уверен, почему это происходит. Означает ли пэр, что клиент вызвал это? Почему это происходит, и как мне справиться с этим?
Некоторые веб-сайты говорят, что это обычное дело, но я не нашел, что лучше всего делать в таких случаях.
5 ответов
Хорошо, ответ был то, что это ошибка сервера - он должен был закрыть соединение после каждого запроса.
Возможно, Android хранит пул соединений и использует старое или что-то в этом роде.
Во всяком случае, теперь это работает.
РЕДАКТИРОВАТЬ: в соответствии с API HttpURLConnection
это можно решить и на стороне клиента:
Потоки ввода и вывода, возвращаемые этим классом, не буферизируются. Большинству абонентов следует обернуть возвращаемые потоки с помощью BufferedInputStream или BufferedOutputStream. Вызывающие абоненты, которые выполняют только массовое чтение или запись, могут пропустить буферизацию. При передаче больших объемов данных на сервер или с сервера используйте потоки, чтобы ограничить объем данных в памяти одновременно. Если вам не нужно, чтобы все тело находилось в памяти одновременно, обрабатывайте его как поток (а не сохраняйте полное тело в виде одного байтового массива или строки).
Чтобы уменьшить задержку, этот класс может повторно использовать один и тот же базовый сокет для нескольких пар запрос / ответ. В результате HTTP-соединения могут оставаться открытыми дольше, чем необходимо. Вызовы connect() могут вернуть сокет в пул подключенных сокетов. Это поведение можно отключить, задав для системного свойства http.keepAlive значение false перед выполнением любых HTTP-запросов. Свойство http.maxConnections можно использовать для контроля количества незанятых соединений с каждым сервером.
Взято из: http://developer.android.com/reference/java/net/HttpURLConnection.html
Попробуйте установить это свойство для HttpURLConnection перед подключением:
conn.setRequestProperty("connection", "close");
Это отключит свойствоkeep-alive, которое включено по умолчанию.
Это старая ветка, которую я знаю. Но это может кому-то помочь.
В моем случае эта ошибка была вызвана службой.NET WCF (soap). Один из объектов в возвращаемом результате имел DataMember со свойством get{}, но без свойства set{}.
Для сериализации в каждом DataMember должны быть доступны оба параметра: get{} и set{}. Я реализовал пустой набор {} (пустой из-за моих бизнес-правил), и проблема была решена.
Мой scenerio - конкретная плохая реализация сервера, но, возможно, это поможет кому-то сэкономить время при устранении неполадок.
У меня было много таких Connection reset by peer
когда я посещал определенные веб-страницы или загружал файлы (из моего приложения или браузера Android).
Оказалось, что это был мой 3G-оператор, который заблокировал соединения (например, загрузка .exe
файл был запрещен).
У тебя такая же проблема на вайфай?
В моей ситуации проблема была решена путем очистки адреса прокси-сервера и порта от APN, созданного оператором. как я уже проверял, использование IP-адреса удаленного сервера вместо имени домена также может решить проблему.
В нашем случае проблема находится на стороне сервера (конфигурация пула приложений в IIS). Я решил эту проблему, установив для параметра Максимальное количество рабочих процессов значение 1. Установка значения больше 1 включит Web Garden, который, по-видимому, является проблемой.