![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
netty
文章平均质量分 85
better_hui
这个作者很懒,什么都没留下…
展开
-
netty之二次解码MessageToMessageDecoder
目录二次解码ObjectEncoder 如何实现编码1、 writeStreamHeader2、writeClassDescriptor总结protobuf的编码解码过程1、ProtobufVarint32FrameDecoder2、ProtobufDecoder3、ProtobufVarint32LengthFieldPrepender4、ProtobufEncoder总结二次解码我们将数据帧 转为正确的byte数组 我们称之为一次解码将byte原创 2021-07-27 23:18:04 · 1694 阅读 · 0 评论 -
netty之粘包拆包ByteToMessageDecoder
目录拆包粘包处理的方式netty的处理方式netty实现编码解码1、cumulator.cumulate() 拼接数据包2、callDecode() 解析数据包总结LengthFieldBasedFrameDecoder拆包粘包粘包产生的原因:两个包小于缓存区的大小,传送数据会将两个包都放在缓冲区中一起发送,就会产生粘包的问题。 半包产生的原因:当某一个包的大于缓冲区的大小,会被发送多次,每次就收到的就是一个不完整的数据包。处理的方式n原创 2021-07-27 23:16:22 · 904 阅读 · 0 评论 -
netty源码之内存池
目录一、DirectBuffer 和 HeapBuffer对外直接内存缓冲堆内存缓冲IO二、Netty的池化池化的好处netty的缓冲池使用1、池化Buffer2、非池化Buffer三、内存分配1、PooledDirectByteBuf对象池的使用2、回收池Recycler原理3、堆外内存的分配四、apache的对象池commons-pool一、DirectBuffer 和 HeapBuffer对外直接内存缓冲direc原创 2021-07-27 23:15:09 · 676 阅读 · 0 评论 -
netty源码之写数据
目录前言和快递比较一下几种场景发送数据的分类写数据flush数据前言write 是把数据写到buf里flush 是将数据发出去writeAndFlush 写入数据到buf 并立刻发送出去和快递比较一下几种场景1、netty协数据,写不进去了 , 会停止写 , 然后注册一个OP_WRITE事件 , 来通知什么时候可以写进去了再写2、netty批量写数据时,如果想写的都写完了, 接下来会尝试写更多 , 调整maxBytesPerG...原创 2021-07-27 20:52:39 · 360 阅读 · 0 评论 -
netty源码之业务逻辑处理
目录前言流程1、业务逻辑的入口,read2、从pipeline的链表上依次执行前言红色的部分就是我们这次分析的核心pipeline , 本质上是一个双向的链接,请注意是双向 , 它有head、tail , 中间有很多Context , 每个context 包含了需要执行的handler ,我们可以正向或者反向的查找下一个要执行的handler。流程1、业务逻辑的入口,read业务逻辑的切入点,可以很明确的确认是在读数据.原创 2021-07-27 20:50:33 · 174 阅读 · 0 评论 -
netty源码之读取数据
目录前话1、读数据的技巧2、简约流程3、读数据的本质流程1、读取数据前话1、读数据的技巧2、简约流程3、读数据的本质流程读数据的轮询和接收连接是一样的 ,都是在NioEventLoop对象的run方法里,但是在最终读的时候,调用了另外一个对象,AbstractNioByteChannel.read 方法1、读取数据//AbstractNioByteChannel public fina...原创 2021-07-27 20:48:41 · 760 阅读 · 0 评论 -
netty源码之接收连接
目录接收链接netty的接收连接前话1、bossGroup 轮询链接事件2、bossGroup 创建socketChannel3、ServerBootstrapAcceptor注册到worker线程4、workerGroup 将 socketChannel 注册到选择的NioEventLoop的selector5、workerGroup 注册读事件接收链接NIO的读事件 while(!stop){//循环遍历selector,休眠时间为1S,当又处于就绪原创 2021-07-27 20:45:56 · 219 阅读 · 0 评论 -
netty之心跳机制
目录一、前言二、netty的心跳工具三、IdleStatehandler1、构造方法2、handlerAdded3、定时任务4、读事件空闲5、写事件空闲一、前言心跳机制就是定时的给对端发送特殊的数据包 , 对端收到后回复特殊的数据包 , 这一次往返的ping-pong过程 , 就是一次心跳,心跳的目的是为了让双方感知 ,对方还活着。TCP协议层也是有心跳机制的 , 但是他的心跳是2个小时 ,且依赖底层操作系统 ,整体来讲不是很灵活 , 所以一般都是在应用层自由原创 2021-07-27 20:41:09 · 1294 阅读 · 0 评论 -
netty源码之NioEventLoop
目录一、初始化1、NioEventLoopGroup最终都是调用父类MultithreadEventLoopGroup的构造器2、通过父类MultiThreadEventExecutorGroup构造器创建NioEventLoopGroup实例,内部维护了一个SingleThreadEventExecutor类型的数组,通过newChild()方法进行实例化3、newChild()方法实例化的是NioEventLoop类型的EventLoop对象4、NioEventLoop 打开一个se原创 2021-07-27 20:39:44 · 182 阅读 · 0 评论 -
netty源码之启动流程
一、前言our thread 就是我们的主线程, boss thread 就是netty的 bossGroup线程 , 也就是reactor的主线程二、启动启动的本质启动的实质是什么?实际上我们只需要找到java nio 的那些代码就可以了1、打开一个selector2、打开一个channel3、绑定一个端口4、将channel 注册到selector 并标明感兴趣的事件netty启动三部曲1、实例化引导程序 ServerBootstrap.原创 2021-07-27 00:08:09 · 132 阅读 · 0 评论 -
netty之channelPipeline
目录一、channelPipeline二、执行流程三、筛选一、channelPipelineBIO中是面向字节流或者字符流来进行传输的。NIO中是基于块的传输,而且是面向channel的。netty是面向管道的 , 这个管道就是包装之后的nio channel 。一个channel 包含了一个channelPipeline管道对象,pipeline中又维护了一系列handlerContext组成的双向链表,这个链表的头是headContext , 尾部是tailContext原创 2021-07-26 20:39:15 · 264 阅读 · 0 评论 -
netty之linux零拷贝
一、DMA拷贝Direct Memory Access , 直接内存访问,是一种无须cpu的参与就可以让外设与系统内存进行双向数据传输的硬件机制。DMA拷贝使系统CPU从实际的IO数据传输中解脱出来,从而大大提高系统吞吐率。在数据传输期间,cpu可以并发的执行其他任务。二、传统IO数据copy传统的IO数据拷贝需要经历4次copy 和 3次状态切换四次copy:1、由硬件 经过DMA ——> 内核buffer2、内核buffer ——> 用户buffe..原创 2021-07-26 20:19:35 · 188 阅读 · 0 评论 -
netty知识总结
目录一、tcp & udp二、tcp如何保证更可靠1、确认应答和序列号2、超时重传3、流量控制4、拥塞控制三、滑动窗口四、状态流转五、粘包、拆包MTU(Maximun Transmission Unit)MSS(Maximun Segment Size)1、引起拆包、粘包的原因2、tcp解决方案3、netty解决方案六、同步、异步、阻塞、非阻塞七、网络IO模型八、BIO、NIO、AIO九、select 、poll 、原创 2021-07-26 20:13:27 · 852 阅读 · 0 评论 -
netty源码之关闭服务
目录一、前言二、客户端的关闭服务1、进入workerGroup.shutdownGracefully()2、NioEventLoop.run() 关闭的入口3、closeAll()4、confirmShutdown()方法5、cleanup() 关闭selector一、前言这里的关闭包含了boss/worker两个线程,是netty提供的优雅退出。二、客户端的关闭服务1、进入workerGroup.shutdownGracefull..原创 2021-07-26 20:10:49 · 854 阅读 · 0 评论 -
netty源码之断开连接
目录一、前言二、正常关闭1、关闭前的处理工作2、doClose0调用jdk的close 关闭channel3、fireChannelInactiveAndDeregister 传播关闭、解绑定事件4、doDeregister取消selector上的selectorKey三、异常关闭四、总结一、前言关闭的逻辑是在read方法里 , 当接受的数据<0时,说明没有可接受的数据了,可以关闭了。二、正常关闭1.allocHandle.las原创 2021-07-26 20:09:48 · 1239 阅读 · 0 评论 -
netty之io模型
前言所有的IO的前戏都是这三部曲1、new socket()2、bind 端口3、监听 端口一、BIOpackage netty.bio;import java.io.InputStream;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.TimeUnit;/** * @a.原创 2021-07-26 20:07:55 · 179 阅读 · 0 评论 -
netty - 线程模型 reactor
目录线程模型1、传统IO服务模型2、Reactor模式reactor三种模式:总结netty模型执行流程简述线程模型1、传统IO服务模型阻塞的IO模式获取输入数据,每个链接需要独立的线程完成数据传输及处理当并发数较大时,创建大量线程,占用系统资源;线程创建后如无数据读写,将被阻塞2、Reactor模式reactor针对传统的IO模型的两个缺点,解决方案:a、基于IO多路复用模型:多个连接共用一个阻塞对象。应用程序只需要在一.原创 2021-07-19 20:57:14 · 1221 阅读 · 0 评论