2012-06-26 82 views
31

在我的應用程序需要通過http://127.0.0.1/...(本地主機url)聯繫它正在使用的同一設備上的「SocketException:Connection by peer」。Android

出於某種原因,在時間(也許正是50%)的50%左右,當我到達使用JSON內容的網站上有,我得到異常:

java.net.SocketException異常:recvfrom的失敗:ECONNRESET(連接重置對等)

對於其他50%,我得到了非常好的結果。我試圖做民意調查(甚至在民意測驗之間有很大的延遲),但我不斷得到相同的奇怪結果。

我搜索了互聯網,也在這裏,我不知道它爲什麼會發生。同行是否意味着客戶造成了這種情況?爲什麼會發生,我該如何處理?

有些網站說這是一件很平常的事情,但我沒有找到在這種情況下最好的做法。

+0

閱讀此以獲取完整的說明和可能的解決方案:http://stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system?lq = 1 –

+1

參見http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-mean – Raedwald

回答

18

好的,答案是這是服務器的錯誤 - 它必須在每次請求後關閉連接。

這可能是Android保持連接池並使用舊的或類似的東西。

無論如何,現在它的工作。


編輯:

由此類返回的輸入和輸出流不被緩衝:根據HttpURLConnection的API,這可以在客戶端也得到解決。 大多數調用者應該使用BufferedInputStream 或BufferedOutputStream包裝返回的流。只進行批量讀取或寫入的呼叫者可能會忽略緩衝。將大量數據傳輸到 服務器或從中傳輸大量數據時,請使用數據流一次限制內存中的數據量。 除非您需要將整個主體一次存儲在內存中,否則將其作爲流(而不是將整個主體存儲爲單個字節數組 或字符串)作爲 進行處理。

爲了減少延遲,該類可以重複使用相同的底層套接字來處理多個請求/響應對。因此,HTTP連接可能會保持打開的時間超過必要的時間。調用disconnect()可能會將 套接字返回到連接的套接字池。通過在發出 任何HTTP請求之前將http.keepAlive系統屬性設置爲false,可以禁用此行爲 。 http.maxConnections屬性可以用來控制到每個服務器的多少空閒連接將被保存。

來自 developer.android.com/reference/java/net/HttpURLConnection.html

+3

那麼你是如何解決它的?你能否詳細說明一下?我患有同樣的問題。 –

+3

正如文中所寫:「通過在發出任何HTTP請求之前將http.keepAlive系統屬性設置爲false,可以禁用此行爲」 –

+0

確定。 Thanx的答覆。 –

0

當我訪問某些網頁或下載文件(從我的應用程序或Android瀏覽器)時,我有很多Connection reset by peer

原來,這是我的3G運營商阻止了連接(例如下載.exe文件被禁止)。

你對Wifi有同樣的問題嗎?

+0

因爲通信與同一個設備,我會期望與它溝通的問題,除非它有真正嚴重的問題。我不認爲它與WiFi vs 3g有任何關係,但我使用WiFi。 –

+0

我想我誤解了這個問題。通過'我用json內容到達一個網站',你的意思是你到達了一個由運行在電話上的網絡服務器託管的網站? –

+0

是的,該設備既是客戶端也是服務器,並且該網頁僅​​包括json響應。 –

1

這是一個古老的線程我知道。但這可能有助於某人。

在我的情況下,這個錯誤是由.NET WCF(soap)服務引起的。返回結果中的一個對象具有帶有{}屬性但沒有集合屬性的DataMember。

要進行序列化,每個DataMember都應該有{} & set {}可用。我實現了一個空集{}(由於我的業務規則而爲空),問題解決了。

我的scenerio是一個特定的錯誤服務器實現,但它可能會幫助他人在故障排除時節省時間。

+0

它在Android操作系統上... –

+1

@androiddeveloper:Android OS是客戶端,但服務器端可以是任何東西。所以他的回答可能不會回答OP,但它可以回答其他人。 +1 –

6

嘗試連接前設置此屬性爲您HttpURLConnection的

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

這將禁用「保活」屬性是默認。