Netty
文章平均质量分 55
Netty学习
学而不思则忘
一切都可以
展开
-
详解Handler业务处理器
整个IO处理操作环节包括:从通道读数据包、数据包解码、业务处理、目标数据解码、把数据包写到通道,然后由通道发送到对端。1. ChannelInboundHandler通道入站处理器channelRegistered:当通道注册完成后,Netty会调用fireChannelRegistered,触发通道注册事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelRegistered方法,会被调用到。channelActive:当通道激活完成后,Netty会调用f原创 2022-05-30 19:09:53 · 395 阅读 · 1 评论 -
详解Pipeline流水线
1. Pipeline入站处理流程先看下面程序,建立了三个入站处理器,按照A—>B—>C的顺序添加:public class InPipeline { public static class SimpleInHandlerA extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) thr原创 2022-05-30 19:09:27 · 1387 阅读 · 0 评论 -
粘包和拆包
概念Netty接收端可能会遇到一下几种情况:读取到一个完整的客户端输入ByteBuf,称为全包读到多个输入ByteBuf,称为粘包读到部分ByteBuf内容,并且有乱码,称为半包粘包和半包可统称为半包问题半包的原理底层网络是以二进制字节报文形式传输数据的。读数据过程:Netty先将二进制数据读取到ByteBuf缓冲区中,然后再转换为POJO对象。写数据过程:将Java类型的数据转化为底层能够传输的二进制ByteBuf数据。在发送端,Netty以ByteBuf为单位来发送数据,但是到原创 2022-05-30 19:09:16 · 193 阅读 · 0 评论 -
ByteBuf浅层复制的使用
浅层复制可以有效避免内存复制。ByteBuf的浅层复制有两种:切片浅层复制和整体浅层复制。切片浅层复制 sliceslice方法可以获取到一个ByteBuf的一个切片。一个ByteBuf可以进行多次的切片浅层复制,多次切片后的ByteBuf对象可以共享一个存储区域。slice方法有两个重载版本:public ByteBuf slice():返回的是ByteBuf中可读部分的切片public ByteBuf slice(int index, int length):可以灵活设置不同起始位置和长度,原创 2022-05-30 19:08:30 · 685 阅读 · 0 评论 -
Reactor反应器模式
反应器模式由Reactor反应器线程、Handlers处理器两大角色组成:Reactor反应器线程的职责:负责响应IO事件,并且分发到Handlers处理器Handlers处理器职责:非阻塞的执行业务逻辑1. 单线程Reactor反应器模式...原创 2022-05-30 19:08:16 · 175 阅读 · 0 评论 -
Decoder原理和浅解
1. ByteToMessageDecoder解码器是一个抽象类,仅提供了一个框架,继承关系如下:解码流程:实现一个自己的ByteBuf解码器:继承ByteToMessageDecoder抽象类实现基类的decode抽象方法。将ByteBuf到POJO解码的逻辑写入此方法。将ByteBuf二进制数据,解码成一个个的Java对象。在子类的decode方法中,需要将解码后的Java POJO对象,放入decode的List< Object >实参中,一个个的传递到下一站的Inbou原创 2022-05-30 19:08:54 · 1976 阅读 · 0 评论 -
详解ByteBuf缓冲区
1. ByteBuf优点与Java NIO的Byte Buffer相比,ByteBuf的优势如下:Pooling池化,减少了内存复制和GC,提升了效率复合缓冲区类型,支持零复制不需要调用flip()方法去切换读/写模式扩展性良好可以自定义缓冲区类型读取和写入索引分开方法的链式调用可以进行引用计数,方便重复使用2. ByteBuf的逻辑部分ByteBuf是一个字节容器,内部是一个字节数组。从逻辑上来分,字节容器内部可以分为四个部分。第一个部分是已用字节,表示已经使用完的废弃的无原创 2022-05-30 19:09:39 · 3439 阅读 · 0 评论 -
四种主要的IO模型
1. 同步阻塞IO在阻塞IO模型中,Java应用程序从IO系统调用开始,直到系统调用返回,在这段时间内,Java进程是阻塞的,返回成功后,应用程序才开始处理用户空间的缓存区数据。优点:开发快。缺点:一个线程维护一个IO连接,在并发量高的情况下,内存、线程切换开销非常大2. 同步非阻塞NIO在NIO模型中,会出现下面两种情况:在内核缓冲区中没有数据的情况下,系统调用会立即返回一个调用失败的信息在内核缓冲器有数据的情况下,是阻塞的,直到数据从内核缓冲区复制到用户进程缓冲。复制完成后,系统调用返回原创 2022-05-29 22:41:03 · 210 阅读 · 0 评论 -
解码器和编码器结合
1. ByteToMessageCodec编解码器这是一个抽象类,继承它,就等同于继承了ByteToMessageDecoder解码器和MessageToByteEncoder编码器这两个基类。有两个方法需要去实现:编码方法:encode(...)解码方法:decode(...)// 示例public class Byte2IntegerCodec extends ByteToMessageCodec<Integer> { @Override public voi原创 2022-05-29 22:39:51 · 564 阅读 · 0 评论 -
Protobuf通信协议
Protobuf的编码过程为:使用预先定义的Message数据结构将实际数据进行打包,然后编码成二进制的码流进行传输或者存储。Protobuf的解码过程为:将二进制码流解码成Protobuf自己定义的Message数据结构的POJO实例。使用方法:// 定义proto协议版本syntax = "proto3";package com.floweryu.netty.protobuf.bean;// 生成POJO类将代码放入指定包中option java_package = "com.flow原创 2022-05-29 22:39:21 · 514 阅读 · 0 评论 -
Netty中的Reactor反应器模式
一、Netty中的Channel通道组件NioSocketChannel:异步非阻塞TCP Socket传输通道NioServerSocketChannel:异步非阻塞TCP Socket服务器监听通道NioDatagramChannel:异步非阻塞的UDP传输通道NioSctpChannel:异步非阻塞Sctp传输通道NioSctpServerChannel:异步非阻塞Sctp服务器监听通道OioSocketChannel:同步阻塞式TCP Socket传输通道O原创 2022-05-29 22:38:34 · 203 阅读 · 0 评论 -
Netty中的Bootstrap启动器
Netty中有两个启动器类,分别用在服务器和客户端。原创 2022-05-29 22:37:05 · 121 阅读 · 0 评论 -
Netty内置的Decoder
1. 固定长度解码器:FixedLengthFrameDecoder适用场景:每个接收到的数据包的长度,都是固定的。该解码器会将入站的ByteBuf数据包拆分成一个个固定长度的数据包,然后发送给下一个入站处理器。2. 行分割解码器:LineBaseFrameDecoder适用场景:每个ByteBuf数据包,适用换行符作为数据包的边界分隔符该场景下,会使用换行符把ByteBuf数据包分割成一个个完整的数据包发送到下一个入站处理器。工作原理:遍历ByteBuf数据包中的可读字节,判断在 二进原创 2022-05-29 22:36:35 · 901 阅读 · 0 评论 -
JSON传输的编码器和解码器原理
以Head-Content为例,解码过程如下:编码过程如下:本质上与传输普通的文本没有区别。原创 2022-05-29 22:36:10 · 167 阅读 · 0 评论 -
Java的NIO
1. NIO和OIO区别OIO面向流,NIO面向缓冲区OIO操作是阻塞的,NIO是非阻塞OIO没有选择器概念,NIO有选择器2. 通道 channel在NIO中,同一个网络连接使用一个通道表示,所有的NIO的IO操作都是从通道开始的。一个通道类似于OIO中的两个流的结合体,既可以从通道中读取,也可以向通道中写入3. 选择器 select通过选择器,一个线程可以查询到多个通道的IO事件的就绪状态4. 缓冲区 buffer通道的读取,就是将数据从通道读取到缓冲区中;通道的写入,就是将数据从原创 2022-05-29 22:34:18 · 87 阅读 · 0 评论 -
Encoder原理和浅解
1. MessageToByteEncoder编码器作用:将POJO对象编码成一个ByteBuf数据包。需要实现此抽象类的encode方法。public class Integer2ByteEncoder extends MessageToByteEncoder<Integer> { @Override public void encode(ChannelHandlerContext ctx, Integer msg, ByteBuf out) thr原创 2022-05-29 22:33:33 · 540 阅读 · 0 评论 -
ChannelInboundHandler生命周期
运行以下程序,可以看到ChannelHandler的方法回调顺序:public class InHandlerDemo extends ChannelInboundHandlerAdapter { @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { System.out.println("被调用-handlerAdded()"); supe原创 2022-05-29 22:32:50 · 275 阅读 · 0 评论