java socket SocketException: recvfrom failed: ECONNRESET

本文探讨了在Java Socket编程过程中遇到recvfrom失败异常(ECONNRESET)的问题,通过分析错误堆栈和代码片段,指出可能是由于输入流(is)已读取完全导致。建议将代码中的读取条件从is.read()改为is.available() > 0来避免此异常,确保从输入流读取操作不会出错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现了,SocketException: recvfrom failed: ECONNRESET 

01-12 23:53:58.481: W/System.err(17174): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
01-12 23:53:58.481: W/System.err(17174): at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:592)
01-12 23:53:58.481: W/System.err(17174): at libcore.io.IoBridge.recvfrom(IoBridge.java:556)
01-12 23:53:58.481: W/System.err(17174): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:485)
01-12 23:53:58.481: W/System.err(17174): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37)
01-12 23:53:58.481: W/System.err(17174): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
01-12 23:53:58.481: W/System.err(17174): at com.action.NetToolServer$ServerTask.handleSocketDefault(NetToolServer.java:349)
01-12 23:53:58.481: W/System.err(17174): at com.action.NetToolServer$ServerTask.run(NetToolServer.java:234)
01-12 23:53:58.481: W/System.err(17174): at java.lang.Thread.run(Thread.java:818)
01-12 23:53:58.481: W/System.err(17174): Caused by: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
01-12 23:53:58.481: W/System.err(17174): at libcore.io.Posix.recvfromBytes(Native Method)
01-12 23:53:58.481: W/System.err(17174): at libcore.io.Posix.recvfrom(Posix.java:161)
01-12 23:53:58.481: W/System.err(17174): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250)
01-12 23:53:58.481: W/System.err(17174): at libcore.io.IoBridge.recvfrom(IoBridge.java:553)
01-12 23:53:58.481: W/System.err(17174): ... 6 more

不敢说我的情况你遇到的也一样,但是我这里java socket的一种情况,算是抛砖引玉了。

NetToolServer.java 是我自己写的代码。

且看代码片段:

try {
	is = socket.getInputStream();
	os = socket.getOutputStream();
	int length = 0;
	byte[] inputByte = new byte[2048];
	byte[] outBuf = new byte[128];

	while ( (length = is.read(inputByte, 0, inputByte.length)) > 0) { //***###***
	//...
<span style="white-space:pre">	</span>os.write(outBuf);
		os.flush();
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
	try {
		is.close();
		os.close();
		socket.close();
			
<span style="white-space:pre">	</span>} catch (IOException e) {
			e.printStackTrace();
	} catch (NullPointerException e) {
	}


指向的是红色行代码。

思前想去,最后发现,这个错误虽然说的是recv server相关的错误,但是这种情况,是因为is有可能已经读取完全了。所以需要修改成为

while (is.available() > 0 && (length = is.read(inputByte, 0, inputByte.length)) > 0) { //***

就好了。保证从inputStream读取没有出错才行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值