
netty
netty学习
jazon@
芜湖
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
OS层面的零拷贝和Netty零拷贝
OS层面的零拷贝和Netty零拷贝 OS层面的零拷贝 1.普通应用程序读写 DMA copy指的是直接内存存取,即不使用CPU拷贝数据到内存,而是DMA引擎传输数据到内存,用于解放CPU。 kernel buffer即内核缓冲区,从利用DMA copy直接从硬盘读到了内核的读缓冲区。 可以看到需要四次内核态和用户态的切换,4次拷贝。 2.mmap优化 mmap通过内存映射,将文件映射到内核缓冲区,用户空间可以共享内核空间的数据。数据不用从kernel buffer拷贝到user buffer了。减少了一原创 2020-09-14 22:56:23 · 292 阅读 · 0 评论 -
Netty心跳服务源码剖析
Netty心跳服务源码剖析 Netty提供了IdleStateHandler,ReadTimeoutHandler,WriteTimeoutHandler三个Handler检测连接有效性,IdleStateHandler,当连接的空闲时间太长时,将会触发一个IdleStateEvent事件。然后,你可以通过你的ChannelInboundHandler中重写userEventTrigged方法来处理该事件,我们分析一下IdleStateHandler。 四个关键属性 private final boolea原创 2020-07-24 00:21:38 · 200 阅读 · 0 评论 -
NioEventLoop源码分析
一、NioEventLoop的继承类图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPAndYhy-1595148814624)(C:\myboot\boot\note\images\NioEventLoop的类图.png)] ScheduledExecutorService接口表示是一个定时任务接口,EventLoop可以接受定时任务。 EventLoop接口: 一旦Channel注册了,就处理该Channel对应的所有I/O操作。 SingleThreadEvent原创 2020-07-19 16:54:00 · 461 阅读 · 0 评论 -
ChannelPipeline,ChannelHandler,ChannelHandlerContext关系及简要代码
ChannelPipeline,ChannelHandler,ChannelHandlerContext关系及简要代码 三者的关系 1.每当ServerSocket创建一个新的连接,就会创建一个Socket,对应的就是目标客户端。 2.每一个新创建的Socket都将会分配一个全新的ChannelPipeline 3.每一个ChannelPipeline内部都含有多个ChannelHnadlerContext pipeline内部是双向链表。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上原创 2020-07-14 23:22:37 · 301 阅读 · 0 评论 -
Netty服务端接受客户端连接请求源码分析
Netty服务端接受客户端连接请求源码分析 前一篇,提到NioServerSocketChannel注册到eventloop中,eventloop就是接受客户端请求的代码。 eventloop作用是一个不断地循环,循环主要做三件事情: 1.有条件地等待Nio事件 2.处理Nio事件 3.处理队列中的任务 我们找到run代码里的processSelectedKeys(),这里是处理各种事件的。追踪发现最后调用的是private void processSelectedKey(SelectionKey k, A原创 2020-07-14 21:34:32 · 374 阅读 · 0 评论 -
Netty-Server启动源码分析
Netty-Server启动源码分析 先提几个问题 netty启动时如何创建NioServerSocketChannel的,是不是用到了JDK的NIO channel? eventloop的run方法是何时开启不断循环运行的从而达到不断监听客户端的连接的? netty是如何将NioServerSocketChannell注册到eventloop的selector的? 先看一段典型的启动Netty的代码 NioEventLoopGroup bossGroup = new NioEventLoopGroup原创 2020-07-12 21:49:08 · 227 阅读 · 0 评论 -
Netty的TCP粘包和拆包及解决方案
Netty的TCP粘包和拆包及解决方案 Tcp将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包,这样做虽然提高了效率,但是接收端难于分辨出完整的数据包了,因为面向流的通信时无消息保护边界的。 上面四种发送情况: 1.服务器分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包 2.服务端一次接受到了两个数据包,D1和D2粘合在一起,称为TCP粘包 3.服务端两次读取到了数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这称为TCP拆包 4.服原创 2020-07-12 21:43:35 · 253 阅读 · 0 评论 -
Netty编解码器
Netty编解码器 1.当Netty发送或者接受一个消息的时候,就将会发生一次数据转换。入站消息会被解码:从字节转换为另一种格式(比如java对象);如果是出站消息,它会被编码成字节。 2.Netty提供了一系列实用的编解码器,他们都实现了ChannelInboundHandler或者ChannelOutboundHandler接口。在这些类中,channelRead方法已经被重写了。当消息入站时,channelRead会被调用,随后它又调用由解码器所提供的decode()方法进行解码,并将已经解码的字节转原创 2020-07-12 21:39:09 · 301 阅读 · 0 评论 -
netty的基本运行原理
netty BIO的缺陷 一个socket由一个线程处理,大量socket引起创建大量线程。 数据读写是以字节流为单位,效率不高 NIO 线程切换效率 NIO编程模型中,新来一个连接不再创建一个新的线程,而是可以把这条连接直接绑定到某个固定的线程,然后这条连接所有的读写都由这个线程来负责。一条连接来了之后,现在不创建一个while死循环去监听是否有数据可读了,而是直接把这条连接注册到selector上,然后,通过检查这个selector,就可以批量监测出有数据可读的连接,进而读取数据。 IO读写原创 2020-07-01 22:46:07 · 391 阅读 · 0 评论 -
Reactor模型
Reactor的朴素模型 static class Server { public static void testServer() throws IOException { // 1、获取Selector选择器 Selector selector = Selector.open(); // 2、获取通道 ServerSocketChannel serverSocke原创 2020-06-07 15:06:36 · 286 阅读 · 0 评论