什么是长连接?Netty如何设置进行长连接?

什么是长连接:

客户端和服务器在完成一次请求-响应后,不会立即断开连接,而是保持连接状态以便多次数据交互,减少频繁建立和断开连接的开销。

而TCP协议建立之后本身没有说会断开的,属于是长连接,除非是其中一方主动断开

而长连接一般意味着连接是复用的,每次发送完请求不关闭下次请求继续使用。而如果并发下只有一个连接可用,所有请求就都得加锁排队等待,因此连接池就出现了,连接池里保留一定数量的连接不关闭,有请求的时候就取出可用连接。

而TCP协议并没有限制一个连接可以保持多久,理论上只要不关闭连接,连接就一直存在。但事实上由于NAT等网络设备的存在,一个连接即使没有主动关闭,它也不会一直存活。

NAT是进行网络地址转化的,会对p包的源ip、源端口、目的ip和目的端口进行替换。而假设现在有A和B要进行长连接,实际上并不与B直接建立连接,而是与NAT A建立长连接,而NAT A又与NAT B、NAT B与B建立长连接。如果NAT设备任由下面的机器保持连接不关闭,那它很容易就耗尽所能支持的连接数,因此NAT设备会定时关闭一定时间内没有数据包的连接,并且它不会通知网络的双方,发送方不知道连接已关闭,会继续通过该连接发送数据而接收方也不知道连接已关闭,还会持续监听该连接,这样发送方收不到接收方的响应就会阻塞接口导致超时。

而要解决这个问题就是在NAT的一定时间内发送数据包来保证NAT不关闭,这个就是心跳检测机制,实际上TCP协议中就包含了一个keepalive机制:如果keepalive开关被打开,在一段时间(保活时间:tcp_keepalive_time) 内此连接不活跃,开启保活功能的一端会向对端发送一个保活探测报文。只要我们保证这个tcp_keepalive_time小于NAT的超时时间,这个探测报文的存在就能保证NAT设备不会关闭我们的连接(HTTP 1.1以后默认开启而HTTP 1.0设计上默认是不支持长连接的)

如何设置长连接

1.在 Bootstrap中设置TCP Keepalive:

bootstrap.option(ChannelOption.SO_KEEPALIVE, true); // 启用 TCP Keepalive

2. 设置空闲检测

Netty 提供了 IdleStateHandler,用于检测连接的空闲状态(读空闲、写空闲、读写空闲)。通过空闲检测,可以在连接空闲时发送心跳包以保持连接。

代码示例

在 ChannelPipeline 中添加 IdleStateHandler

pipeline.addLast(new IdleStateHandler(60, 30, 0, TimeUnit.SECONDS)); // 60秒读空闲,30秒写空闲


3. 实现心跳机制

而如果使用TCP协议层的Keeplive机制,但是该机制默认的心跳时间是2小时,依赖操作系统实现不够灵活;所以可以继承IdleStateHandler或者ChannelInboundHandlerAdapter实现自定义心跳包检测

代码示例

自定义心跳处理器:

public class HeartbeatHandler extends ChannelInboundHandlerAdapter {
    private static final ByteBuf HEARTBEAT_PACKET = Unpooled.wrappedBuffer(new byte[]{0x01}); // 心跳包内容

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state() == IdleState.WRITER_IDLE) {
                // 写空闲时发送心跳包
                ctx.writeAndFlush(HEARTBEAT_PACKET.duplicate());
                log.info("发送心跳包");
            } else if (event.state() == IdleState.READER_IDLE) {
                // 读空闲时关闭连接
                log.warn("读空闲超时,关闭连接");
                ctx.close();
            }
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
}

4. 设置连接超时

为了防止连接长时间无响应,可以设置连接超时时间。

代码示例

在 Bootstrap 中设置连接超时:

bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); // 5秒连接超时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

启动虚拟机中客户机后导致电脑蓝屏的解决办法

不考虑重新安装虚拟机的解决办法有两种: vmx文件破损时使用 1)删除CentOS 64-bit.vmx文件 2)打开vmware-0.log文件,找到CONFIGURATION 和 USER DEFAULTS 并把这两个之间的内容拷贝出来 删除框出来的部分,复制框出来的…

Word2Vec中的CBOW模型训练原理详细解析

Word2Vec中的CBOW模型训练原理详细解析 1. CBOW模型概述 CBOW模型的训练目标是利用一个单词周围的上下文单词来预测该单词本身。具体来说,给定当前单词的上下文单词,通过训练神经网络来最大化当前单词出现在这些上下文单词中的概率。 2. 模型结构 CB…

Android Studio打包APK

1.导出APK安装包 如果是首次打包,Create new 单击蓝色对话框右边文件夹📂图标 ,选择密钥保存路径,然后在下方File name对话框中填写您想要名称,再点击OK回到密钥创建对话框。 在此对话框中填写密码(Passwo…

MySql字段的值是以逗号隔开的另一个表的主键关联查询

查询sql SELECT s.student_id, s.name, c.name as course_name FROM student s INNER JOIN course c ON FIND_IN_SET(c.course_id, s.course_id) > 0 WHERE 1 1;相似sql -- 翻译(需要带条件,可用于字典翻译,但条件需要注意唯一性&#…

windows git bash 使用zsh 并集成 oh my zsh

参考了 这篇文章 进行配置,记录了自己的踩坑过程,并增加了 zsh-autosuggestions 插件的集成。 主要步骤: 1. git bash 这个就不说了,自己去网上下,windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…

QD Laser携“Lantana”激光器参展SPIE光子学西部展2025,聚焦紧凑型设计

据悉,QD Laser公司将在2025年SPIE光子学西部展览会上展出其最新产品——世界最小一体化紧凑型可见光激光器“Lantana”。该展会将于1月28日至30日在旧金山的Moscone中心举行。 在展会期间,QD Laser公司将现场展示这款超小型、轻便设备—— “Lantana”。…

Ubuntu 22.04 TLS 忘记root密码,重启修改的解决办法

1.想办法进入这个界面,我这里是BIOS引导的是按Esc按一下就行,UEFI的貌似是按Shift不得而知,没操作过。下移到Advanced options for Ubuntu,按enter 2.根据使用的内核版本,选择带「recovery mode」字样的内核版本&#…

Proteus-8086调试汇编格式的一点心得

这阵子开始做汇编的微机实验(微机原理与接口技术题解及实验指导,吴宁版本13章),中间出了挺多问题,解决后记录下。 先上电路图 用子电路来仿真发现仿真的时候子电路这块根本没有高低电平输出,只好把子电路拿…

外部flash烧写算法学习笔记(一)

一,STM32CubeProgrammer STM32下载编程工具 | STM32CubeProg介绍、下载、安装和使用教程 - 知乎 1.使用速览 2.外部烧写 二,QSPI外部烧写算法制作 STM32H7的花式玩转SPI Flash章节也更新了,含MDK下载算法制作和STM32CubeProg下载算法制作 …

在centos上编译安装opensips【初级-默认安装】

环境:centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…

【Prometheus】PromQL进阶用法

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Fabric区块链网络搭建:保姆级图文详解

目录 前言1、项目环境部署1.1 基础开发环境1.2 网络部署 2、后台环境2.1、环境配置2.2、运行springboot项目 3、PC端3.1、安装依赖3.2、修改区块链网络连接地址3.3、启动项目 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加…

【SpringCloud】黑马微服务学习笔记

目录 1. 关于微服务 ?1.1 微服务与单体架构的区别 ?1.2 SpringCloud 技术 2. 学习前准备 ?2.1 环境搭建 ?2.2 熟悉项目 3. 正式拆分 ?3.1 拆分商品功能模块 ?3.2 拆分购物车功能模块 4. 服务调用 ?4.1 介绍 ?4.2 RustTemplate?的使用 4.3 服务治理-注册中…

RabbitMQ1-消息队列

目录 MQ的相关概念 什么是MQ 为什么要用MQ MQ的分类 MQ的选择 RabbitMQ RabbitMQ的概念 四大核心概念 RabbitMQ的核心部分 各个名词介绍 MQ的相关概念 什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出&am…

鸿蒙参考文档和问题记录

本文用于记录鸿蒙使用过程中的问题和相关参考文档 问题记录 1. 兼容性测试套件问题 ActsStartAbilityForResultNoTargetBundleListStageTest套件测试失败:模块FreeInstall 技术资料 1. HarmonyOS应用如何打包HAP并安装到真机 HarmonyOS应用如何打包HAP并安装到真…

虚幻基础-1:cpu挑选(14600kf)

能帮到你的话,就给个赞吧 😘 文章目录 ue非常吃cpu拉满主频打开项目编写蓝图运行原因 时间长 关于压力测试 本文以14600kf为例,双12购入,7月份产。 ue非常吃cpu 经本人测试,ue是非常吃cpu的。 拉满主频 无论任何时间…

css动画水球图

由于echarts水球图动画会导致ios卡顿&#xff0c;所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践

在现代 Web 开发中&#xff0c;前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台&#xff0c;涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8&#xff1a;稳定且广泛使用的 Java 版本。 Spring…

nginx离线安装部署详解(附一键启动 环境变量)

学习nginx的过程中 看了许多帖子 但是都没有全套的部署 所以想自己写一篇帖子 正好也可以给后续想要学习nginx的人参考一下 当时在学习的时候总是在想 为什么要学习离线安装 这玩意不是一个dnf命令不就完事了吗 在后续的学习中才发现 原来在实际环境中许多机器都是离线…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(一)

Understanding Diffusion Models: A Unified Perspective&#xff08;一&#xff09; 文章概括引言&#xff1a;生成模型背景&#xff1a;ELBO、VAE 和分层 VAE证据下界&#xff08;Evidence Lower Bound&#xff09;变分自编码器 &#xff08;Variational Autoencoders&#x…