![](https://img-blog.csdnimg.cn/direct/75aad2b26a994475b4a794147308f66b.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
图解IO与Netty系列
文章平均质量分 95
深入浅出解析IO模型、IO多路复用、JavaNIO、Reactor模型、Netty的使用、Netty核心组件解析、以及Netty源码等。可以全面掌握IO和Netty相关的技术和底层原理。适合新手入门和老司机复习。
黄俊懿
放下期待、不抱希望地努力,踏踏实实,能走多远是多远。
展开
-
【图解IO与Netty系列】Netty源码解析——ChannelPipeline中的责任链模式
AbstractChannelHandlerContext的invokeChannelRead方法里面,一般会进入if条件分支,拿到ChannelHandlerContext的ChannelHandler,因为是处理read事件,read事件是入站事件,所以是ChannelInboundHandler类型,然后调用ChannelInboundHandler的channelRead方法进行事件处理,ChannelInboundHandler的channelRead方法就是我们实现的处理逻辑。原创 2024-06-22 11:49:43 · 745 阅读 · 0 评论 -
【图解IO与Netty系列】Netty源码解析——事件循环
就是通过allocator分配一个ByteBuf,然后把Channel中的数据读取到ByteBuf中,然后调用pipeline.fireChannelRead(byteBuf)触发ChannelPipeline的处理,然后ChannelPipeline中的ChannelHandler就会处理byteBuf中的数据,这里的ChannelPipeline中的ChannelHandler就是我们定义的ChannelInitializer组装到ChannelPipeline中的ChannelHandler了。原创 2024-06-22 11:48:33 · 1182 阅读 · 0 评论 -
【图解IO与Netty系列】Netty源码解析——服务端启动
今天我们一起来学习Netty源码,对Netty有一个深入的认知,既能掌握其使用和原理,又能对它底层的设计有一个大概的认知。原创 2024-06-16 16:22:41 · 771 阅读 · 0 评论 -
【图解IO与Netty系列】Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制
网络传输是以字节流的形式传输的,而我们的应用程序一般不会直接对字节流进行处理,而是把字节流解析成有一定结构的数据格式再去处理。因此我们在发送数据时,要对我们的数据进行编码,把它转换成二进制字节流的形式,然后在网络中进行传输,当我们接收到对方传输过来的二进制字节流时,又需要对其进行解码,解析成应用程序能够处理的数据格式。根据不同的协议或不同的功能,Netty提供了对应的编码器或解码器,有处理SSL或TLS协议的、有处理HTTP协议的、有做HTTP压缩的、有处理WebSocket协议的等等。原创 2024-06-16 16:20:31 · 876 阅读 · 2 评论 -
【图解IO与Netty系列】Netty核心组件解析
Selector就是NIO中的Selector,Selector是一个多路复用器,我们可以往Selector注册多个Channel,Selector可以帮我们监听注册在其上的Channel,当我们调用Selector的select()方法时,当前线程就阻塞,通过Selector监听注册在其上的Channel,等待关注的事件就绪。除了持有NIO的Channel以外,还保存了各自关注的事件类型,等真正把NIO的Channel注册到Selector上的时候,就可以直接设置对应的事件类型。原创 2024-06-10 16:09:02 · 775 阅读 · 0 评论 -
【图解IO与Netty系列】Netty快速入门
Netty是高性能的网络通信框架,底层对Java的NIO进行了封装,特点是简单易用易上手,又能为应用提供高性能的网络通信能力。在网络通信场景中,我们一般使用Netty进行开发而不是NIO,因为Java的NIO使用非常的复杂,代码不易于维护。并且在网络通信中,我们需要对协议编解码、断线重连、心跳检测等问题进行处理,这些在NIO中都是不具备的,需要我们手动编码实现。而Netty则对NIO进行了封装,使得我们无需编写复杂的NIO代码,又能实现高性能的网络通信。原创 2024-06-10 16:04:50 · 952 阅读 · 1 评论 -
【图解IO与Netty系列】Reactor模型
Reactor模型是服务器端用于处理高并发网络IO请求的编程模型,与传统的一请求一线程的同步式编程模型不同的是,Reactor模型是基于事件驱动的响应式编程模型,可以一个线程处理多个请求,并且是异步处理,在高并发场景下,性能大大的提升。传统的同步式编程模型如下:服务端接收到请求后,从线程池中拿出一个线程(比如Tomcat里的线程池),经过Controller、Service、Dao的一顿处理,最后返回响应结果给客户端。这种同步处理请求的方式效率并不高,可以应对一些并发量不高的场景。原创 2024-06-01 20:23:27 · 947 阅读 · 0 评论 -
【图解IO与Netty系列】Java世界里的NIO
由于Socket编程有以上种种缺点,从JDK1.4开始就推出了NIO的编程模型。NIO是非阻塞式IO操作,性能比起过去的原生Socket编程在性能上有很大提升。但是要注意的是,Java的NIO与Linux的NIO不是一个东西,Java的NIO底层使用的其实是IO多路复用。原创 2024-06-01 20:20:05 · 801 阅读 · 0 评论 -
【图解IO与Netty系列】IO多路复用
于是就有了NIO,NIO是同步非阻塞式IO,在客户端未发送数据前,服务端用户线程线程调用read()函数不会阻塞,而是马上返回一个error,用户线程可以先干点别的事情,然后再次尝试read(),如果此时数据就绪,那么read()函数会阻塞,用户线程把内核空间的数据拷贝到用户空间。于是就是有了IO多路复用。epoll_create创建一个epoll实例,epoll实例使用一个红黑树结构保存注册进来的socket文件描述符,然后使用一个链表保存就绪的socket文件描述符,此时epoll实例还是空的。原创 2024-05-26 14:45:17 · 1160 阅读 · 0 评论 -
【图解IO与Netty系列】IO的同步与异步、阻塞与非阻塞,Linux五种IO模型
如果数据已经在内核空间了,那么当前线程调用read函数就会拷贝内核空间的数据到用户空间,这个拷贝的过程是同步读取,是当前线程主动拷贝的,因此在线程拷贝数据到用户空间的这段时间,程序是不会往下执行的。如果客户端发送的数据已被拷贝到内核空间,操作系统会发送一个SIGIO信号给当前线程,当前线程转而执行之前注册的SIGIO信号处理函数,里面会调用redvfrom读取内核空间的数据到用户空间,此时是由当前线程主动拷贝数据,因此从内核空间拷贝数据到用户空间期间当前线程阻塞,因此还是同步IO。BIO是同步阻塞式IO。原创 2024-05-26 14:42:18 · 736 阅读 · 0 评论