Java Socket编程报错Connection reset by peer

         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了连接。


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








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值