2012-06-26 10 views
31

Moja aplikacja musi skontaktować się z tym samym urządzeniem, nad którym pracuje, przez http://127.0.0.1/... (adres URL localhost).Uzyskiwanie "SocketException: zerowanie połączenia przez peer" w Androidzie

Z jakiegoś powodu, około 50% czasu (a może dokładnie 50%) kiedy osiągnie internetowej jest z zawartością JSON, otrzymuję wyjątek:

java.net.SocketException: recvfrom zawiodły (Connection Reset by Peer) ECONNRESET

Dla pozostałych 50%, dostaję doskonale dobre rezultaty. Próbowałem przeprowadzić ankiety (a nawet duże opóźnienie między ankietami), ale wciąż otrzymuję te same dziwne wyniki.

Szukałem w Internecie, a także tutaj, i nie jestem pewien, dlaczego tak się dzieje. Czy peer oznacza, że ​​spowodował to klient? Dlaczego tak się dzieje i jak mam sobie z tym poradzić?

Niektóre witryny podają, że jest to typowe, ale nie znalazłem w tych przypadkach najlepszych rozwiązań.

+0

Przeczytaj to, aby uzyskać pełne wyjaśnienie i możliwe rozwiązanie: http://stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system?lq = 1 –

+1

Zobacz również http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-mean – Raedwald

Odpowiedz

18

OK, odpowiedź brzmiała, że ​​to wina serwera - musiała zamknąć połączenie po każdym żądaniu.

Możliwe, że system Android utrzymuje pulę połączeń i korzysta ze starego lub czegoś podobnego.

W każdym razie, teraz działa.


Edycja: zgodnie z API HttpURLConnection ten można rozwiązać po stronie klienta zbyt:

Strumienie wejściowe i wyjściowe powrotu tej grupie nie są buforowane. Większość osób dzwoniących powinna zawinąć zwrócone strumienie za pomocą metody BufferedInputStream lub BufferedOutputStream. Rozmówcy, którzy tylko zbiorczo odczytują lub zapisują, mogą pominąć buforowanie. Podczas przesyłania dużych ilości danych do lub z serwera użyj strumieni, aby ograniczyć ilość danych w pamięci naraz. Jeśli nie potrzebujesz całego ciała do zapisania w pamięci jednocześnie, przetwarzaj je jako strumień (zamiast przechowywać całe ciało jako pojedynczą tablicę bajtową lub ciąg).

Aby zmniejszyć opóźnienie, ta klasa może ponownie użyć tego samego podstawowego gniazda dla wielu par żądań/odpowiedzi. W wyniku tego połączenia HTTP mogą być przechowywane dłużej niż to konieczne. Połączenia z rozłączeniem() mogą zwrócić gniazdo do puli podłączonych gniazd. To zachowanie można wyłączyć , ustawiając właściwość systemową http.keepAlive na wartość false przed wydaniem żądań HTTP. Właściwość http.maxConnections może być używana do kontrolowania liczby bezczynnych połączeń z każdym serwerem.

albumu: developer.android.com/reference/java/net/HttpURLConnection.html

+3

, więc jak to rozwiązałeś? Czy mógłbyś to rozwinąć? Cierpię z tym samym problemem. –

+3

jak napisano w tekście: "To zachowanie można wyłączyć, ustawiając właściwość systemową http.keepAlive na wartość false przed wydaniem jakichkolwiek żądań HTTP" –

+0

OK. Dziękuję za odpowiedź. –

0

Miałem wiele z tych Connection reset by peer podczas odwiedzania niektórych stron internetowych lub pobierania plików (z mojej aplikacji lub przeglądarki Android).

Okazało się, że to mój operator 3G zablokował połączenia (na przykład pobieranie pliku .exe było zabronione).

Czy masz ten sam problem z Wi-Fi?

+0

, ponieważ komunikacja jest z tym samym urządzeniem, oczekiwałbym 0 problemów z komunikacją z nim, chyba że ma naprawdę poważne problemy. Nie sądzę, że ma to coś wspólnego z wifi vs 3g, ale używam wifi. –

+0

Chyba źle zrozumiałem pytanie. "Docieram do strony internetowej z zawartością json", oznacza to, że docierasz do witryny hostowanej przez serwer internetowy działający w telefonie? –

+0

tak, urządzenie jest zarówno klientem, jak i serwerem, a strona zawiera tylko odpowiedź json. –

1

Jest to stary wątek wiem. Ale to może pomóc komuś.

W moim przypadku ten błąd został spowodowany przez usługę .NET WCF (mydło). Jeden z obiektów zwracanego wyniku miał właściwość DataMember z get {}, ale nie ustawiono właściwości set {}.

Aby wystąpiła serializacja, każdy element DataMember powinien mieć zestaw {} & zestaw {}. Zaimplementowałem pusty zbiór {} (pusty ze względu na moje reguły biznesowe) i problem został rozwiązany.

Moje scenerio jest specyficzną wadliwą implementacją serwera, ale być może pomoże to komuś zaoszczędzić czas podczas rozwiązywania problemów.

+0

Działa w systemie operacyjnym Android ... –

+1

@androiddeveloper: system operacyjny Android jest stroną klienta, ale strona serwera może być dowolna. Jego odpowiedź może więc nie odpowiadać na PO, ale może odpowiedzieć komuś innemu. +1 –

6

spróbuj ustawić tę właściwość na Twój HttpURLConnection przed podłączeniem:

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

To spowoduje wyłączenie „utrzymania aktywności” własności, która jest domyślnie włączona.

Powiązane problemy