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了连接。
最后,经过排查确认,果然印证了我们的结论,服务器在处理报文长度时出错。两边协调修正一下,终于通讯成功了!