netty-基础

同步与异步

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

  • 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
  • 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

  • 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  • 同步机制 发送方发送请求之后,需要等接收方发回响应后才接着发
  • 异步机制 发送方发送一个请求之后不等待接收方响应这个请求,就继续发送下个请求。
  • 阻塞调用调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回,该线程在此过程中不能进行其他处理
  • 非阻塞调用调用结果不能马上返回,当前线程也不会被挂起,而是立即返回执行下一个调用。(网络通信中主要指的是网络套接字Socket的阻塞和非阻塞方式,而soket 的实质也就是IO操作)
  • 同步阻塞方式 发送方发送请求之后一直等待响应。接收方处理请求时进行的IO操作如果不能马上等到返回结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作
  • 同步非阻塞方式发送方发送请求之后,一直等待响应,接受方处理请求时进行的IO操作如果不能马上的得到结果,就立即返回,取做其他事情。但是由于没有得到请求处理结果,不响应发送方,发送方一直等待。一直等到IO操作完成后,接收方获得结果响应发送发后,接收方才进入下一次请求过程。(实际不应用)
  • 异步阻塞方式 发送方向接收方请求后,不等待响应,可以继续其他工作,接收方处理请求时进行IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作。 (实际不应用)
  • 异步非阻塞方式发送方向接收方请求后,不等待响应,可以继续其他工作,接收方处理请求时进行IO操作如果不能马上得到结果,也不等待,而是马上返回取做其他事情。当IO操作完成以后,将完成状态和结果通知接收方,接收方在响应发送方。(效率最高)

基于异步的事件驱动的网络应用框架

事件和ChannelHandler

通过事件通知状态的改变或操作的状态。每个事件都会分发到ChannelHandler的具体实现方法。

每个ChannelHandler都是一种为了响应特定事件而被执行的回调。

选择器、EventLoop

通过事件触发将selector从应用程序中抽象出来,消除手动派发,在内部,将会为每个channel分配一个eventLoop,处理所有事件。EventLoop通过一个线程驱动,处理一个channel的所有I/O事件,并且在整个生命周期不会改变,

ChannelInboundHandler 响应入站事件

基础组件

Channel接口

基本的IO操作(bind()、connect()、read()、write())都是依赖底层网络传输提供的原语,基本的就是Socket。Netty 的 Channel 接口所提供的 API,大大地降低了直接使用 Socket 类的复杂性。

EventLoop接口

用于处理连接生命周期中所发生的事件,

  • 一个 EventLoopGroup 包含一个或者多个 EventLoop
  • 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;
  • 所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理;
  • 一个 Channel 在它的生命周期内只注册于一个 EventLoop
  • 一个 EventLoop 可能会被分配给一个或多个 Channel

 
ChannelFuture接口
所有的IO都是异步的,因此一个操作可能不会立即返回,所以我们需要一种用于在之后的某个时间点确定其结果的方法,
 
ChannelHandler接口
所有处理入站和出站数据的应用程序逻辑容器,他的方法由网络事件触发进行回调,可专门用于几乎任何类型的动作,例如将数据从一种格式转换为另外一种格式,或者处理转换过程中所抛出的异常。
ChannelPipeline接口
提供了ChannelHandler链的容器,并定义了用于在该链上传播入站和出站事件流的API,当Channel被创建时,会被自动分配到专属的ChannelPipeline。
 
通过使用作为参数传递到每个方法的 ChannelHandlerContext ,事件可以被传递给当前 ChannelHandler 链中的下一个 ChannelHandler 因为你有时会忽略那些不感兴趣的事件,所以 Netty 提供了抽象基类 ChannelInboundHandlerAdapter ChannelOutboundHandlerAdapter 。通过调 用 ChannelHandlerContext 上的对应方法,每个都提供了简单地将事件传递给下一个 ChannelHandler 的方法的实现。随后,你可以通过重写你所感兴趣的那些方法来扩展这些类。
 
ChannelHandler的适配类:
 
  • ChannelHandlerAdapter
  • ChannelInboundHandlerAdapter
  • ChannelOutboundHandlerAdapter
  • ChannelDuplexHandler

编码器和解码器

通过 Netty 发送或者接收一个消息的时候,就将会发生一次数据转换。入站消息会被 解码;也就是说,从字节转换为另一种格式,通常是一个 Java 对象。如果是出站消息,则会发生相反方向的转换:它将从它的当前格式被编码 为字节。这两种方向的转换的原因很简单:网络数据总是一系列的字节。
 

启动类Boostrap

建立网络连接的启动类
 
服务端两个 EventLoopGroup,客户端一个?

,服务端需要两个,一个用来只包含ServerChnnel,代表服务器自身的已经绑定到某个本地端口的正在监听的套接字上,第二个包含所有已经创建的用来处理传入客户端连接的Channel。

 

当有新连接进入时,会为每个请求创建Channel的EvenLoop,一旦接受请求,就会把它放到第二个EventLoopGroup中。

 
ChannelPipeline 持有所有将应用于入站和出站数据以及事件的 ChannelHandler 实例,这些 ChannelHandler 实现了应用程序用于
处理状态变化以及数据处理的逻辑。
  • ChannelHandler 的典型用途包括:
  •  将数据从一种格式转换为另一种格式;
  •  提供异常的通知;
  • 提供 Channel 变为活动的或者非活动的通知;
  • 提供当 Channel 注册到 EventLoop 或者从 EventLoop 注销时的通知;
  •  提供有关用户自定义事件的通知。
采用 拦截过滤器设计模式

 

零拷贝
零拷贝(zero-copy)是一种目前只有在使用 NIO 和 Epoll 传输时才可使用的特性。它使你可以快速高效地将数据从文件系统移动到网络接口,而不需要将其从内核空间复制到用户空间。
 
 

ByteBuf和ByteBufHolder

优点:

 

  • 它可以被用户自定义的缓冲区类型扩展;
  • 通过内置的复合缓冲区类型实现了透明的零拷贝;
  • 容量可以按需增长(类似于 JDK StringBuilder);
  • 在读和写这两种模式之间切换不需要调用 ByteBuffer flip()方法;
  • 读和写使用了不同的索引;
  • 支持方法的链式调用;
  • 支持引用计数;
  • 支持池化。

会维护两个不同的索引:一个用于读,一个用于写,当你从 ByteBuf 读取时,它的 readerIndex 将会被递增已经被读取的字节数。同样地,当你写入ByteBuf 时,它的 writerIndex 也会被递增。

堆缓冲区:

将数据存储在JVM的堆空间,能在没有池化的情况下提供快速的分配和释放。

直接缓冲区:

JVM堆之外的内存区域,直接缓冲区的主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为昂贵

复合缓冲区:

多个缓冲区表示为单个合并缓冲区的虚拟表示。

ByteBufAllocator

Unpooled

ByteBufUtil

Channel 的生命周期

ChannelHandler 的生命周期

ChannelInboundHandler ——处理入站数据以及各种状态变化;

ChannelOutboundHandler——处理出站数据并且允许拦截所有的操作。

ChannelInboundHandler 接口

ChannelOutboundHandler 接口(推迟操作或事件

ChannelPromise ChannelFuture
ChannelOutboundHandler 中的大部分方法都需要一个 ChannelPromise参数,以便在操作完成时得到通知。 ChannelPromise ChannelFuture 的一个子类,其定义了一些可写的方法,如setSuccess() setFailure() ,从而使 ChannelFuture 不可变。

ChannelHandler 适配器

资源管理

-Dio.netty.leakDetectionLevel=ADVANCED

ReferenceCountUtil.release(msg);释放资源

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        boolean release = true;

        try {
            if (this.acceptInboundMessage(msg)) {
                this.channelRead0(ctx, msg);
            } else {
                release = false;
                ctx.fireChannelRead(msg);
            }
        } finally {
            if (this.autoRelease && release) {
                ReferenceCountUtil.release(msg);
            }

        }

    }
ChannelPipeline 接口

ChannelHandlerContext 接口

ChannelHandlerContext 代表了 ChannelHandler ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext。 ChannelHandlerContext 的主要功能是管理它所关联的 ChannelHandler 和在 同一个 ChannelPipeline 中的其他 ChannelHandler 之间的交互。

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,NURBS(非均匀有理B样条)是一种强大的数学工具,用于表示和处理复杂的曲线和曲面。NURBS在计算机图形学、CAD(计算机辅助设计)、CAM(计算机辅助制造)等领域有着广泛的应用。下面将详细探讨MATLAB中NURBS的绘制方法以及相关知识点。 我们需要理解NURBS的基本概念。NURBS是B样条(B-Spline)的一种扩展,其特殊之处在于引入了权重因子,使得曲线和曲面可以在不均匀的参数空间中进行平滑插值。这种灵活性使得NURBS在处理非均匀数据时尤为有效。 在MATLAB中,可以使用`nurbs`函数创建NURBS对象,它接受控制点、权值、 knot向量等参数。控制点定义了NURBS曲线的基本形状,而knot向量决定了曲线的平滑度和分布。权值则影响曲线通过控制点的方式,大的权值会使曲线更靠近该点。 例如,我们可以使用以下代码创建一个简单的NURBS曲线: ```matlab % 定义控制点 controlPoints = [1 1; 2 2; 3 1; 4 2]; % 定义knot向量 knotVector = [0 0 0 1 1 1]; % 定义权值(默认为1,如果未指定) weights = ones(size(controlPoints,1),1); % 创建NURBS对象 nurbsObj = nurbs(controlPoints, weights, knotVector); ``` 然后,我们可以用`plot`函数来绘制NURBS曲线: ```matlab plot(nurbsObj); grid on; ``` `data_example.mat`可能包含了一个示例的NURBS数据集,其中可能包含了控制点坐标、权值和knot向量。我们可以通过加载这个数据文件来进一步研究NURBS的绘制: ```matlab load('data_example.mat'); % 加载数据 nurbsData = struct2cell(data_example); % 转换为cell数组 % 解析数据 controlPoints = nurbsData{1}; weights = nurbsData{2}; knotVector = nurbsData{3}; % 创建并绘制NURBS曲线 nurbsObj = nurbs(controlPoints, weights, knotVector); plot(nurbsObj); grid on; ``` MATLAB还提供了其他与NURBS相关的函数,如`evalnurbs`用于评估NURBS曲线上的点,`isoparm`用于生成NURBS曲面上的等参线,以及`isocurve`用于在NURBS曲面上提取特定参数值的曲线。这些工具对于分析和操作NURBS对象非常有用。 MATLAB中的NURBS功能允许用户方便地创建、编辑和可视化复杂的曲线和曲面。通过对控制点、knot向量和权值的调整,可以精确地控制NURBS的形状和行为,从而满足各种工程和设计需求。通过深入理解和熟练掌握这些工具,可以在MATLAB环境中实现高效的NURBS建模和分析。
水利大数据助力智慧水利 智慧水利是现代水利管理的重要发展方向,它不仅仅是一种技术或产品,而是一个涉及理论框架、政策、资金、人才、技术、商业模式和各业务系统的全面创新的复杂巨系统工程。智慧水利的核心是以水利信息化服务为基础,通过监测、传输、存储、分析、预警和智能应用等系统服务,全面提升水资源管理、防汛抗旱、水土保持和水务一体化管理等水利现代化业务的能力。 智慧水利现状与挑战 目前,智慧水利建设在全国范围内尚未全面展开,许多地区仍停留在传统水利信息化的基础上。面临的主要难题包括筹建自主权弱、发展不均衡、建设周期长、数据孤岛严重、泄密安全和建设失控等。政策理念落后、资金问题、行业封闭和技术储备不足也是制约智慧水利发展的重要因素。此外,系统设计更新不及时、商业模式不明显等问题也亟待解决。 智慧水利技术路线 智慧水利的技术路线涉及实体网络、管理网络和信息网络的整合。通过物联感知技术,如山洪灾害监测、取水口监测、闸门远程测控等,实现数据信息的自动采集、传输、处理、存储及应用。业务应用方面,涵盖水行政执法监督、水资源信息服务、水资源业务管理、多元汛情旱情监测预报等多个领域,推动水利管理向智能化、精细化发展。 水利大数据平台 水利大数据平台是智慧水利建设的关键支撑。它通过激光、遥感、GIS、BIM、传感网和射频技术等现代化信息化技术,整合多源、多维、大量和多态的水利数据。平台不仅整合水利行业各部门的基础数据库和生产监测数据,还涉及跨部门跨行业的涉水数据和涉水社会情况数据。通过行政手段、经济手段和技术手段,实现数据的抽取、整合和共享,为智慧水利提供强大的数据支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值