Android中調用WebService拋出Connection reset by peer異常

來源:互聯網
上載者:User

標籤:android   style   http   java   使用   os   

最近在做的項目中用到了WebService,因為Android中沒有提供直接調用WebService的Api,我就使用了 ksoap,但是在使用過程中遇到了一個奇怪的BUG:

請求一次WebService之後,什麼都不做,靜待1分鐘之後,再次請求這個WebService時就會拋出以下異常:

06-17 15:11:07.869: W/System.err(10915): java.net.SocketException: sendto failed: ECONNRESET (Connection reset by peer)

06-17 15:11:07.879: W/System.err(10915): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:510)

06-17 15:11:07.879: W/System.err(10915): at libcore.io.IoBridge.sendto(IoBridge.java:479)

06-17 15:11:07.879: W/System.err(10915): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508)

06-17 15:11:07.879: W/System.err(10915): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)

06-17 15:11:07.879: W/System.err(10915): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270)

06-17 15:11:07.879: W/System.err(10915): at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)

06-17 15:11:07.879: W/System.err(10915): at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:85)

06-17 15:11:07.879: W/System.err(10915): at libcore.net.http.FixedLengthOutputStream.flush(FixedLengthOutputStream.java:49)

06-17 15:11:07.879: W/System.err(10915): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:188)

06-17 15:11:07.879: W/System.err(10915): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)

06-17 15:11:07.879: W/System.err(10915): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)

06-17 15:11:07.879: W/System.err(10915): at com.mycos.mobile.util.WebServiceUtils.getObject(WebServiceUtils.java:144)

06-17 15:11:07.879: W/System.err(10915): at com.mycos.mobile.util.WebServiceUtils.getString(WebServiceUtils.java:63)

06-17 15:11:07.879: W/System.err(10915): at com.mycos.mobile.util.WebServiceAsyncRunner$1.run(WebServiceAsyncRunner.java:38)

06-17 15:11:07.879: W/System.err(10915): Caused by: libcore.io.ErrnoException: sendto failed: ECONNRESET (Connection reset by peer)

06-17 15:11:07.879: W/System.err(10915): at libcore.io.Posix.sendtoBytes(Native Method)

06-17 15:11:07.879: W/System.err(10915): at libcore.io.Posix.sendto(Posix.java:151)

06-17 15:11:07.879: W/System.err(10915): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)

06-17 15:11:07.879: W/System.err(10915): at libcore.io.IoBridge.sendto(IoBridge.java:477)

06-17 15:11:07.879: W/System.err(10915): ... 12 more

從堆棧資訊來看是串連被伺服器重設了,可為什麼連續請求沒問題,靜待一分鐘後再請求卻會被重設呢?

想了很久,想不出到底是什麼問題導致了這個異常,只好使用另外一種辦法來繞過了這個異常:

類比HttpClient的重試機制,為WebService請求也增加重試機制,如果拋出java.net.SocketException之後,再連續請求兩次請求(加上第一次,最大重試次數為3)。

問題解決了,不是用最好的辦法!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.