Socket編程過程中,用戶端向服務端發送請求,會遇到以下錯誤:java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
01-11 23:07:25.065: W/System.err(11804): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)01-11 23:07:25.073: W/System.err(11804): at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:634)01-11 23:07:25.073: W/System.err(11804): at libcore.io.IoBridge.recvfrom(IoBridge.java:596)01-11 23:07:25.073: W/System.err(11804): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:492)01-11 23:07:25.073: W/System.err(11804): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:42)01-11 23:07:25.073: W/System.err(11804): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:242)01-11 23:07:25.073: W/System.err(11804): at java.io.BufferedInputStream.read(BufferedInputStream.java:290)01-11 23:07:25.073: W/System.err(11804): at com.emp.common.pos.JConnection.read(JConnection.java:185)
調試這種錯誤的時候,最煩的就是雙方扯皮,找不到問題根源,用戶端說伺服器處理有問題,伺服器說用戶端代碼有錯。
用戶端明明接入其他通道沒問題,為什麼接入該通道會報錯呢。那麼伺服器有沒有收到請求呢。先分析一下錯誤譯文:
Connection reset by peer:串連被對等端重設。那麼peer是什麼意思。有這麼一段話:
用戶端(client)是通訊的發起者,而伺服器(server)程式則被動等待用戶端發起通訊,並對其作出響應。
一個程式是作為用戶端還是伺服器,決定了它在與其對等端(peer)建立通訊時使用的通訊端API(用戶端的對等端是伺服器,反之亦然)。
很明顯,得到了以下結論:
1、用戶端的peer就是伺服器,伺服器的peer是用戶端;
2、用戶端之前接入其他通道通訊正常,說明用戶端代碼出錯幾率不高,伺服器處理出錯嫌疑驟升;
3、伺服器reset了串連。至少說明了伺服器收到了請求報文,由於某種原因導致處理資料失敗,不得已reset了串連。
最後,經過排查確認,果然印證了我們的結論,伺服器在處理報文長度時出錯。兩邊協調修正一下,終於通訊成功了。