IO网络编程(五)

Netty4学习笔记(8)-- Channel接口 Channel是Netty4最核心的接口之一,拥有将近40个方法和一个内部接口。本文将对Channel接口的众多方法做一个归类和总结,为进一步研究Channel实现做准备。 阅读详情

Netty核心组件

Channel
ChannelFuture
EventLoop
ChannelHandler
ChannelPipeline

Channel、EventLoop 和 ChannelFuture

Channel、EventLoop 和 ChannelFuture这三个抽象类聚合在一起,可以被认为是 Netty 网络抽象的代表:
 Channel—Socket;
 EventLoop—控制流、多线程处理、并发;
 ChannelFuture—异步通知。

1.Channel接口

基本的 I/O 操作(bind()、connect()、read()和 write())依赖于底层网络传输所提供的原语。在基于 Java 的网络编程中,其基本的构造是 class Socket。Netty 的 Channel 接 口所提供的 API,大大地降低了直接使用 Socket 类的复杂性。channel是一个管道,用于连接字节缓冲区Buf和另一端的实体,这个实例可以是Socket,也可以是File, 在Nio网络编程模型中, 服务端和客户端进行IO数据交互(得到彼此推送的信息)的媒介就是Channel.

    ChannelId id();
	//返回channel所注册的 eventLoop
    EventLoop eventLoop();
	//返回当前Channel的父channel
    Channel parent();
	//关于channel的 一些列配置信息
    ChannelConfig config();
	//检查channel是否开启
    boolean isOpen();
	//检查channel是否注册
    boolean isRegistered();
	//检查channel是否存活
    boolean isActive();
	// 返回channel的元数据
    ChannelMetadata metadata();
	
    //  服务器的ip地址
	SocketAddress localAddress();

	// remoteAddress 客户端的ip地址
    SocketAddress remoteAddress();

    ChannelFuture closeFuture();

    boolean isWritable();

    long bytesBeforeUnwritable();

    long bytesBeforeWritable();
	//内部的一个Unsafe方法
    Channel.Unsafe unsafe();
	// 返回Channel的管道
    ChannelPipeline pipeline();

    ByteBufAllocator alloc();

    Channel read();

    Channel flush();

public interface Unsafe {
        Handle recvBufAllocHandle();

        SocketAddress localAddress();

        SocketAddress remoteAddress();
		//  把channel注册进EventLoop
        void register(EventLoop var1, ChannelPromise var2);
		//给channel绑定一个 adress
        void bind(SocketAddress var1, ChannelPromise var2);
		//......
        void connect(SocketAddress var1, SocketAddress var2, ChannelPromise var3);

        void disconnect(ChannelPromise var1);

        void close(ChannelPromise var1);

        void closeForcibly();

        void deregister(ChannelPromise var1);

        void beginRead();

        void write(Object var1, ChannelPromise var2);

        void flush();

        ChannelPromise voidPromise();

        ChannelOutboundBuffer outboundBuffer();
    }

此外,Channel 也是拥有许多预定义的、专门化实现的广泛类层次结构的根,下面是一个简短的部分清单:
 EmbeddedChannel;
 LocalServerChannel;
 NioDatagramChannel;
 NioSctpChannel;
 NioSocketChannel。

EventLoop 接口

EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。运行任务处理的在编程上的构造通常称作事件循环,Netty使用EventLoop来描述。一个EventLoop将由一个永远不会变的Thread驱动,它可以被指派给多个channel,任务提交给Eventloop之后可以立即执行或者调度执行。任务的执行顺序是以先进先出的顺序执行。
 一个 EventLoopGroup 包含一个或者多个 EventLoop;
 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;
 所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理;
 一个 Channel 在它的生命周期内只注册于一个 EventLoop;
 一个 EventLoop 可能会被分配给一个或多个 Channel。
关系如下图:
在这里插入图片描述

ChannelFuture接口

Netty 为异步非阻塞,即所有的 I/O 操作都为异步的,因此,我们不能立刻得知消息是否已经被处理了。JDK 预置了 interface java.util.concurrent.Future,但是其所提供的实现,只 允许手动检查对应的操作是否已经完成,或者一直阻塞直到它完成。这是非常繁琐的,所以 Netty 提供了它自己的实现——ChannelFuture,用于在执行异步操作的时候使用。通过该接口的 addListener() 方法注册一个ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。

Channel channel = ...
ChannelFuture future = channel.connect(new InetSocketAddress("192.168.0.1",6666));
// 注册一个监听器
future.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
// do something....
} else {
// 输出错误信息
Throwable cause = future.cause();
cause.printStackTrace();
// do something....
}
}
});

ChannelFutureListener接口中还提供了几个简单的默认实现

public interface ChannelFutureListener extends GenericFutureListener<ChannelFuture> {
	// 在Future完成时关闭
    ChannelFutureListener CLOSE = new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) {
            future.channel().close();
        }
    };
    // 如果失败则关闭
    ChannelFutureListener CLOSE_ON_FAILURE = new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) {
            if (!future.isSuccess()) {
                future.channel().close();
            }

        }
    };
    // 将异常信息传递给下一个ChannelHandler
    ChannelFutureListener FIRE_EXCEPTION_ON_FAILURE = new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) {
            if (!future.isSuccess()) {
                future.channel().pipeline().fireExceptionCaught(future.cause());
            }

        }
    };
}

ChannelHandler和ChannelPipeline

ChannelHandler

ChannelHandler属于业务的核心接口,用于处理IO事件或者拦截IO操作,并将其转发到ChannelPipeline(业务处理链)中的下一个处理程序。
ChannelHandler的主要用途包括:
对入站与出站数据的业务逻辑处理
记录日志
将数据从一种格式转换为另一种格式,实现编解码器。以一次HTTP协议(或者其他应用层协议)的流程为例,数据在网络传输时的单位为字节,当客户端发送请求到服务器时,服务器需要通过解码器(处理入站消息)将字节解码为协议的消息内容,服务器在发送响应的时候(处理出站消息),还需要通过编码器将消息内容编码为字节。
捕获异常
提供Channel生命周期内的通知,如Channel活动时与非活动时

入站消息与出站消息由其对应的接口ChannelInboundHandler与ChannelOutboundHandler负责,这两个接口定义了监听Channel的生命周期的状态改变事件的回调函数。ChannelInboundHandlerAdapter与ChannelOutboundHandlerAdapter都继承于ChannelHandlerAdapter,该抽象类简单实现了ChannelHandler接口。

Pipeline与ChannelPipeline

ChannelPipeline是一个handler的集合,它负责处理和拦截出站和入站的事件和操作。ChannelPipeline实现了拦截过滤器模式,使用户能控制事件的处理方式。在Netty中,每个Channel都有且只有一个ChannelPipeline与之对应。
一个 Channel 包含了一个 ChannelPipeline,而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler。
在这里插入图片描述

小结

在这里插入图片描述
上图中各个组件关系如下:
1.最重要的就是NioEventLoop,起了两种类型的线程,一个是监听客户端连接,另一个是处理客户端读写
2.channel就是对一条连接的封装,在channel封装的api中可以进行数据读写
3.对数据的读写可以看做是逻辑处理的链(Pipeline),每一个的逻辑处理都是一个ChannelHandler
4.在一条channel中的数据读写都是基于ByteBuffer来操作的。

参考:https://blog.youkuaiyun.com/a724888/article/details/80742828
https://www.cnblogs.com/clawhub/p/11968113.html

通俗编程——白话NIO之Channel Channel简介在标准的IO当中,都是基于字节流/字符流进行操作的,而在NIO中则是是基于Channel和Buffer进行操作,其中的Channel的虽然模拟了流的概念,实则大不相同。 阅读详情

相关推荐

(五)理解网络编程中的几种IO模型

文章摘要:本文详细解析了数据从网卡到应用程序的IO处理流程,包括硬件层面的网卡接收、内核空间处理以及用户态应用读取三个主要阶段。重点比较了BIO、NIO和AIO三种IO模型的特点与实现差异:BIO采用同步阻塞方式,NIO通过非阻塞和IO多路复用提升性能,AIO则基于异步回调机制。文章还指出用户态与内核态频繁切换的系统开销问题,并介绍了Java堆外内存、Netty零拷贝等优化方案。最后强调好的架构是逐步演进出来的,需要持续的架构治理。

2501_93282817的博客 1270

Netty学习笔记(10)——Netty中的Channel组件

1.Channel的功能 1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操作封装到一个接口中,统一对外提供。相比于NIO中的Channel,Netty提供的Channel相关组件使用起来更加灵活方便。 2. API功能介绍: (1)Chan...

江左煤郎的博客 722

H3C交换机S-MLAG实战:如何用bond4模式实现服务器高可用(附避坑指南)

本文详细介绍了H3C交换机S-MLAG技术与服务器bond4模式的实战配置,帮助实现跨设备链路聚合的服务器高可用方案。通过解析S-MLAG技术优势、bond4模式选择、关键配置步骤及常见问题排查,提供了一套完整的避坑指南和优化建议,适用于企业级网络架构的高可用需求。

weixin_30790841的博客 465

netty4.0.x源码分析—channel

备注:本文的分析基于netty 4.0.9final版本,仅对Nio进行分析,因为本人对Socket编程比较感兴趣。 1、channel总体机构图 nio channel的总体结构图如下: 2、关键类和接口分析 2.1  基于NioServerSocketChannel进行分析 1)Channel Channel是顶层接口,继承了AttributeMap, ChannelOut

pingnanlee的专栏 1万+

智慧城市项目实战:如何将你的地理数据从城市坐标系(如上海2000)转换到国家CGCS2000?

本文详细介绍了智慧城市项目中地理数据坐标系转换的全流程解决方案,重点讲解如何将城市坐标系(如上海2000)转换到国家CGCS2000。通过七参数布尔莎模型、ArcGIS Pro、QGIS开源方案及Python编程实现,帮助实施团队解决坐标系不统一的技术难题,确保空间分析精度。

weixin_28725949的博客 304

【OpenStack】OpenStack原理(一)——OpenStack发展及架构

OpenStack目前的七个核心组件,分别是计算(Compute)、对象存储(Object Storage)、认证(Identity)、用户界面(Dashboard)、块存储(Block Storage)、网络(Network)和镜像服务(Image Service)。

大数据分析BDA 2万+

Netty学习之旅------Netty Channel 概述

1、Channel官方概述 先附上官方关于Channel的介绍。 /** * A nexus to a network socket or a component which is capable of I/O * operations such as read, write, connect, and bind. * <p> * A channel provides a...

中间件兴趣圈 8378

光伏逆变器在环测试解决方案

光伏行业是利用太阳能光辐射将其转化为可用电能的行业。近年来,为应对气候变化和能源安全等挑战,全球对清洁能源的需求不断增长。太阳能作为最具潜力和可再生的能源之一,被视为替代传统化石能源的重要选择,光伏行业因此得到了迅猛发展,并在全球范围内得到了广泛应用。许多国家和地区都将光伏技术作为关键的能源发展方向。尤其是在新兴和发展中国家,光伏发电具有巨大的增长潜力,将成为未来市场竞争的重点。随着规模化生产的推进,光伏组件的制造成本不断降低。

shiwei0813的博客 959

windows socket网络编程五:重叠IO模型

文章目录分析事件通知重叠IO结构体创建支持重叠IO的socket投递异步Accept投递异步Recv投递异步Send询问事件获取重叠信号分类处理运行结果完成例程投递异步Accept投递异步Recv投递异步Send分类处理运行结果模型流程图源码链接 分析 在解决了select模型本身的同步阻塞问题后,我们还要处理send、recv、accept的执行阻塞。 我们socket的操作本质上都是字符串的拷贝复制,重叠IO是windows提供的一种异步读写文件的机制,将读的指令以及我们的buffer投给操作系统,然后

c++小白的博客 1869

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1090

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

a_zxswer的博客 1688

SOCKET网络编程五:IO多路复用epoll

一、关于select、poll、epoll这三者使用、对比介绍这篇: 网络编程--IO多路复用之select,poll和epoll详解 二、poll的使用和上篇的select大同小异: int main(void) { //当客户端结束时,服务器还维持一个僵尸进程 signal(SIGCHLD, SIG_IGN);//使用signal忽略SIGCHLD信号(第一种方法) /*sign...

mazi的博客 571

如何使用PostgreSQL数据库进行数据仓库的ETL操作

本文旨在为数据工程师、数据库管理员和分析师提供使用PostgreSQL进行数据仓库ETL操作的全面指南。ETL流程的基本原理PostgreSQL在ETL中的独特优势实际ETL实现的技术细节性能优化和最佳实践常见问题的解决方案首先介绍ETL和PostgreSQL的基本概念然后深入探讨核心技术和实现方法接着提供实际案例和代码示例最后讨论优化技巧和未来趋势ETL:提取(Extract)、转换(Transform)、加载(Load)的缩写,描述数据从源系统移动到目标数据仓库的过程。

2502_91592937的博客 873

五、网络编程之网络 IO 模型的本质.md

介绍总结网络 IO 相关知识

weixin_45004203的博客 560

广东省道路工程检测练习试题(单选题)真题

1.一般项目的合格点率应达到( ),且不合格点的最大偏差值不得大于规定允许偏差值的1.5倍。A.不低于75%B.不低于80%C.不低于85%D.不低于90%答案:B2.进行土路基平整度检测时,当路宽小于9m,检测点数应为( )A.1B.2C.3D.4答案:A3.根据《城镇道路工程施工与质量验收规范》,在分部工程中,根据工种、材料、施工工艺等划分的是( )A.单位工程B.分项工程C.分部工程D.工序工程答案:B4.根据《城镇道路工程施工与质量验收规范》,土方路基压实度的检测频率为每1000m每压实层抽检( )

ZShy001238的博客 681

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c++应用网络编程之五Windows常用的网络IO模型

在Windows平台上,网络高并发的开发,重点以游戏居多。其它的当然也可以做,毕竟IOCP可不是白给的。其实游戏行业是一个非常好的方向,开发者如果有兴趣的话可以深入的学习研究。当人们吃饱饭的时候儿,精神食粮就提到了必须的日程上来。至于游戏对青少年的影响,就看大环境了。已经好多年不在Windows上进行编程了,以后的网络编程重要分析也是以类Linux平台为主。

fpcc的专栏 843

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux网络编程(五-IO模型)

IO模型

qq_53508543的博客 925

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java网络编程(五):Java 非阻塞 IO 和异步 IO

上一篇文章介绍了 Java NIO 中 Buffer、Channel 和 Selector 的基本操作,主要是一些接口操作,比较简单。 本文将介绍非阻塞 IO 和异步 IO,也就是大家耳熟能详的 NIO 和 AIO。很多初学者可能分不清楚异步和非阻塞的区别,只是在各种场合能听到异步非阻塞这个词。 本文会先介绍并演示阻塞模式,然后引入非阻塞模式来对阻塞模式进行优化,最后再介绍 JDK7 引...

萝卜代码 722

IO系列文章之五:读《Scalable io in java》看Socket网络编程模型演变

最近利用业余时间在看Java NIO,期间读了线程大师Doug Lea那篇很经典的《Scalable IO in Java》。在此写一写看过之后,对于Socket编程模型演变的一些理解。 首先,对于网络编程,一般都有一个共同的流程: (1)读请求. (2)解码请求. (3)计算处理逻辑. (4)编码响应. (5)发送响应.   一、经典阻塞IO模型: (图片来源:《Scala...

258

网络编程复习(五):Socket编程中的IO模式详解

先来说说同步和异步: 在JAVA的程序设计中,同步就是指代码按顺序一步一步向下执行,比如说main方法,如果没有多线程,那么该方法必定是一步一步按顺序向下执行,那么如果我在main方法中开启一个线程,那么这个单独的线程与main程序在宏观上可以看做是同时执行的,这就是异步。 Socket网络编程的通信方式可以分为四种: 一:同步阻塞: 这是最最古老的实现方式,也是第一节提到的,在此种方式下

Lee_Ho_的博客 582

【C++网络编程】(五)IO多路复用:poll,epoll

时,如果当前没有任何监控的文件描述符处于就绪状态,进程会被挂起(进入休眠状态)并加入内核的阻塞链表,这是为了避免浪费 CPU 资源。当某个文件描述符的事件发生时,内核会检查阻塞链表,将那些因为等待该事件而阻塞的进程从链表中移除,并将它们唤醒,进程接着可以处理就绪的文件描述符。然而,如果在 ET 模式下未能处理完所有就绪的文件描述符,后续这些文件描述符将不会被再次通知,可能导致数据丢失。,默认值一般为 1024。仅在状态发生变化时返回文件描述符,例如,从不可写变为可写,或从不可读变为可读,或有新数据到来。

weixin_44378835的博客 1616

unix网络编程(五)--IO复用+非阻塞

Linux下的非阻塞IO

sunny_ss12的专栏 529

高性能网络编程(五)IO复用与并发编程

对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽。 并发编程有很多种实现模型,最简单的就是与“线程”捆绑,1个线程处理1个连接的全部生命周期。优点:这个模型足够简单,它可以实

傅红雪的专栏 468

C++网络编程(五):IO多路复用实现并发服务器

目录前置知识五种IO模型阻塞i/o非阻塞I/O模型I/O复用模型信号驱动I/O模型异步I/O模型五种I/O模型比较selectselect引入seclect应用实例POLLepoll总结select poll epoll区别参考资料 前置知识 1.Unix五种IO模型 [1] blocking IO - 阻塞IO [2] nonblocking IO - 非阻塞IO [3] IO multiplexing - IO多路复用 [4] signal driven IO - 信号驱动IO [5] asynchro

weixin_44164489的博客 2554

孤舟笔记 IO 与网络编程篇五 网络编程你真的懂吗?从Socket到TCP连接全解析

本文系统介绍了Java网络编程的核心知识:1)TCP和UDP的核心API及差异,TCP面向连接可靠传输,UDP无连接不可靠;2)TCP编程的三次握手过程与Socket对应关系;3)服务端线程模型演进,从一连接一线程到NIO Selector多路复用;4)TCP连接状态流转,重点解析TIME_WAIT和CLOSE_WAIT状态;5)Socket常用参数设置。文章通过代码示例和对比表格,帮助读者全面掌握网络编程基础,为理解上层框架奠定基础。

学无止境 (专注java,爱好前端) 500

高性能网络编程五--IO复用与并发编程

对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽。 并

hjxhjh的专栏 1024
上一篇: RedisTemplate基本学习
下一篇: Spring Cloud 组件入门学习---Eureka
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值