netty:Connection reset原因

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-631000.html

到了这里,关于netty:Connection reset原因的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • netty学习(3):SpringBoot整合netty实现多个客户端与服务器通信

    创建一个SpringBoot工程,然后创建三个子模块 整体工程目录:一个server服务(netty服务器),两个client服务(netty客户端) pom文件引入netty依赖,springboot依赖 NettySpringBootApplication NettyServiceHandler SocketInitializer NettyServer NettyStartListener application.yml Client1 NettyClientHandler SocketInitializ

    2024年02月11日
    浏览(60)
  • 14.Netty源码之模拟简单的HTTP服务器

    HTTP 服务器是我们平时最常用的工具之一。同传统 Web 容器 Tomcat、Jetty 一样,Netty 也可以方便地开发一个 HTTP 服务器。我从一个简单的 HTTP 服务器开始,通过程序示例为你展现 Netty 程序如何配置启动,以及引导器如何与核心组件产生联系。 完整地实现一个高性能、功能完备、

    2024年02月15日
    浏览(49)
  • 游戏服务器中使用Netty进行Http请求管理

    作为游戏服务器,无法避免与第三方系统交互。例如:登陆、充值、中台等,这些平台很多都是Web平台,提供http服务接口。这就需要游戏具备http访问功能。 Netty实现异步http调用。 效率:netty的多路复用技术,实现的异步http可以用很少的几个线程实现同时成百上千个http请求

    2024年02月08日
    浏览(46)
  • 【随笔】Git 高级篇 -- 远程服务器拒绝 git push & reset(三十二)

    💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘 您的点赞、关注、收藏、评论,是对我最大

    2024年04月26日
    浏览(31)
  • 用netty轻松实现一个高效稳定的TCP服务器

              随着物联网的发展,很多项目都开始涉及到了tcp连接这块,在这里我们轻松用netty去实现,站在巨人的肩膀上。 关于netty包引用: 实现TCP服务器代码 依赖netty只需几行代码tcp服务:  业务处理代码(参考) 以下是处理报文业务类可参考,注意代码未优化:  运行

    2024年02月22日
    浏览(46)
  • Netty客户端发送数据给服务器的两个通道(1)

    EventLoopGroup group = new NioEventLoopGroup();// 设置的连接group。 Bootstrap bootstrap = new Bootstrap().group(group).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) // 超时时间。 .channel(NioSocketChannel.class).handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new

    2024年04月14日
    浏览(45)
  • [AIGC] 快速掌握Netty,打造高性能IM服务器!

    前言:Netty 是一个非常优秀的网络应用程序框架,支持高并发、高性能的网络通信,适用于开发各种服务器程序,如即时通讯、游戏、物联网等。使用 Netty 可以大大提升服务器程序的性能和可靠性。本文将介绍 Netty 的基本原理和使用方法,并给出一个简单的 IM 程序示例,帮

    2024年02月06日
    浏览(51)
  • 使用Netty构建TCP和UDP服务器和客户端

    Netty是一个基于Java NIO实现的网络通信框架,提供了高性能、低延迟的网络通信能力。使用Netty构建TCP和UDP服务器和客户端非常简单,下面是一个简单的示例代码: 构建TCP服务器 构建TCP客户端 构建UDP服务器 构建UDP客户端   上述示例代码中,分别定义了一个TCP服务器、TCP客户

    2024年02月16日
    浏览(49)
  • 【服务器管理】connection refused问题解决

    在配置服务器的时候,遇到了这个问题。我当时明明已经搭建好了服务,但是我在客户端比如手机上,却怎么都连不上服务器。看日志的话显示的是 connection refuesed + timeout 这种情况,大概率是服务器的端口没有被打开。 我们只需要把端口打开就好了。 https://tool.chinaz.com/por

    2024年02月01日
    浏览(34)
  • 构建异步高并发服务器:Netty与Spring Boot的完美结合

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 ChatGPT体验地址 在Java基础中,IO流是一个重要操作,先上八股 BIO:传统的IO,同步阻塞,一个连接一个线程。一般不怎么使用 AIO:JDK7引入的,异步非阻塞IO NIO:JDK1.4之后新的API,是多路复用,允许你一次性处理

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包