netty:Connection reset原因

Connection reset

服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示“java.net.SocketException: Connection reset”。

异常说明

java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。

  1. 该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,
  2. 第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。
  3. 另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的

TCP建立连接时需要三次握手

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

第二次握手:服务器收到syn包,并会确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

除了以上这些常见的标志头信息,还有另外一些标志头信息,比如推标志PSH、复位标志RST等。其中复位标志RST的作用就是“复位相应的TCP连接”。

原因1

服务器关闭了Connection为什么会返回“RST”而不是返回“FIN”标志

  1. 原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了
  2. 问题就出在“我不接受数据” 上,如果此时客户端还往服务器发送数据,服务器内核接收到数据,但是发现此时Socket已经close了,则会返回“RST”标志给客户端。当然,此时客户端就会提示:“Connection reset”

详细说明可以参考oracle的有关文档:http://docs.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html

参考博客

解决方法

我出现的问题是网络原因,网络突然变化出现这种情况
网上搜索了一下,说是有下面的三种解决方法:来源

  1. 出错了重试;
  2. 客户端和服务器统一使用TCP长连接;
  3. 客户端和服务器统一使用TCP短连接。

这篇博客说的非常清楚,也说明如何解析日志,可以参考:https://www.cnblogs.com/shoren/p/httpclient-connectionreset.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
netty java.io.IOException: Connection reset by peer是指在使用netty框架进行网络通信时,发生了对等方断开连接的异常。这意味着连接的对方主动关闭了连接,或者由于某种原因导致连接被非正常地中断。这种异常通常出现在网络通信中,当一方试图向另一方发送数据时,对方已经关闭了连接。 这种异常可能有多种原因引起,其中一种常见的原因是连接超时或者网络延迟导致连接断开。另外,网络错误也可能导致连接被重置。例如,如果网络出现故障,连接可能会被重置以恢复正常的通信。 要解决这个异常,可以采取以下几个步骤: 1. 检查网络连接:确保网络连接是稳定的,并且没有其他网络问题,例如网络延迟或者丢包。可以通过ping命令测试网络连接。 2. 检查连接超时设置:如果发现连接超时导致连接被重置,可以尝试增加连接超时时间,以便允许更长的连接时间。 3. 检查连接状态:在代码中,可以通过判断连接的状态来避免发送数据到已经关闭的连接。可以使用isConnected()方法来检查连接是否仍然有效。 4. 处理异常情况:当出现连接重置异常时,可以根据具体情况采取适当的处理措施。例如,可以尝试重新建立连接,或者向用户显示错误信息。 总之,netty java.io.IOException: Connection reset by peer异常表示连接的对方已经关闭了连接或者由于其他原因导致连接中断。通过检查网络连接、连接超时设置、连接状态以及处理异常情况,可以解决这个异常。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java.io.IOException: Connection reset by peer](https://blog.csdn.net/weixin_45631366/article/details/109543495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值