![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Netty
了不起的盖茨比。
如果把一切都准备好了再前行,那我们永远迈不出第一步。
展开
-
Netty源码(十二)之服务端向客户端写数据的过程
前面的几篇博客大致的介绍整个Netty核心的代码,以及启动的流程,服务端的读取流程,以及常用的解码器的源码。至此Netty的源码还剩一个服务端向客户端写数据的流程。今天我们就来介绍一下服务端向客户端写的流程。写的方式有以下两种,具体代码如下:ctx.writeAndFlush("");ctx.channel().writeAndFlush("");这两种方式的区别具体如下图所示:可以看到我们如果执行ctx.writeAndFlush("");方法后,当前的handler后面所有handler都会原创 2020-08-30 17:00:45 · 703 阅读 · 0 评论 -
Netty源码(十一)之LengthFieldBasedFrameDecoder/LengthFieldPrepender
1.前文前两篇博客我介绍了三种解码器,分别是基于固定长度的解码器(FixedLengthFrameDecoder),基于行的解码器(LineBasedFrameDecoder),基于分割符解码器(DelimiterBasedFrameDecoder)今天我们这篇博客介绍最后一种解码器,就是基于长度的解码器(LengthFieldBasedFrameDecoder)2.协议的简介由于大多数的协议,协议头中会携带长度的字段,用于标示消息体或整包的长度,例如SMPP、HTTP协议等。由于基于长度解码需求的通原创 2020-08-29 22:45:01 · 637 阅读 · 0 评论 -
Netty源码(十)之LineBasedFrameDecoder和DelimiterBasedFrameDecoder
上篇博客我们说了其中一个解码器,就是基于固定长度的解码器FixedLengthFrameDecoder,这种解码器,不具有通用性,很多时候,都是用不到的,我们来介绍一下新的解码器,就是基于行(\n,\r)的解码器LineBasedFrameDecoder。由于上篇博客我们已经介绍了一个最简单的解码器,这篇博客不会在介绍前置的流程了,具体的前置的流程可以看上篇博客。我们打开对应的LineBasedFrameDecoder的源码,发现和FixedLengthFrameDecoder继承的是同一个父类ByteTo原创 2020-08-28 18:29:19 · 640 阅读 · 0 评论 -
Netty源码(九)之服务端读取数据的过程
前面八篇博客,我们已经介绍了服务端的主Reactor线程的启动流程,以及服务端的工作Reactor线程的启动流程,以及工作的Reactor线程注册感兴趣的事件的过程,今天这篇博客我们主要介绍一下工作线程的读取数据的流程,以及介绍几个常用的的pipeline。就让我们直接进入对应的代码,走来直接看工作线程中的循环流程。具体的代码如下:public final class NioEventLoop extends SingleThreadEventLoop { //事件循环 @Override p原创 2020-08-27 16:08:47 · 981 阅读 · 0 评论 -
Netty源码(八)之新客户端接入的过程
前面几篇博客我已经介绍整个服务端的启动的过程,主要就是服务端的Reactor线程的启动流程,一些信息的初始化过程,这篇博客我主要介绍客户端的接入的过程,主要还是看服务端的Reactor的线程中干的事,主要的代码如下,我们继续重温一下,具体的代码如下:public final class NioEventLoop extends SingleThreadEventLoop { //事件循环 @Override protected void run() { for (;;) {原创 2020-08-25 20:23:43 · 304 阅读 · 1 评论 -
Netty源码(七)之pipeline的生命周期以及规避Nio的空轮训的Bug
前面的六篇博客,我们已经讲了服务端的整个启动的流程,并且基于源码的做了一些解释,这篇博客我们主要讲下pipeline的生命周期的函数的调用过程。为此我们书写了以下的代码,首先看下我们服务端的启动代码,具体的代码如下:import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.chann原创 2020-08-24 19:44:39 · 506 阅读 · 0 评论 -
Netty源码(六)之doBind0()方法的过程
上篇博客我们介绍了任务队列中调用过程,分别介绍的register0的调用过程,以及往pipeline添加ServerBootstrapAcceptor的过程。这两个任务已经介绍完了。这个时候还有一个任务就是doBind0中添加的一个方法,这就是我们今天要介绍的方法。让我们重现对应的代码吧!由于我们每篇博客中都重现了服务端的代码,这篇博客我们就不重现了,我们直接看doBind0方法,具体的代码如下:public abstract class AbstractBootstrap<B extends Ab原创 2020-08-22 22:21:16 · 335 阅读 · 0 评论 -
Netty源码(五)之SingleThreadEventExecutor.this.run()的过程
上篇博客已经讲完了bind()方法,但是bind()方法中还有两个部分没有讲,一个是dobind0()方法,还有一个就是在执行register()的方法的时候开启了一个线程执行register0()方法,这个线程开启的方法就是我们主要讲的。下面就让我们代码重现吧。具体的代码如下所示: public abstract class AbstractChannel extends DefaultAttributeMap implements Channel { protected abstract class原创 2020-08-21 21:13:10 · 1328 阅读 · 0 评论 -
Netty源码(四)之ServerBootstrap的bind(二)的过程
在上篇博客:Netty源码(三)之ServerBootstrap的bind(一)的过程,我们讲了NioServerSocketChannel初始化和创建的过程,我们这篇博客接着上篇博客继续讲,我们继续重现上一篇博客的代码,具体的代码如下:import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.原创 2020-08-20 20:56:34 · 361 阅读 · 0 评论 -
Netty源码(三)之ServerBootstrap的bind(一)的过程
在前两篇博客中我们分别介绍了NioEventLoopGroup的创建过程和ServerBootstarp的创建的过程前面的准备的过程都已经结束了。是时候启动我们的服务端了,打开我们熟悉的代码,具体的代码如下:import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.C原创 2020-08-18 14:37:42 · 1029 阅读 · 0 评论 -
Netty源码(二)之ServerBootstrap初始化的过程
上篇博客《Netty源码(一)之NioEventLoopGroup初始化的过程》我们说了NioEventLoopGoup的初始化的过程。今天我们来讲讲ServerBootstrap的初始化的过程,我们继续重现上篇博客的代码,具体的代码如下:import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io原创 2020-08-15 15:35:27 · 595 阅读 · 0 评论 -
Netty源码(一)之NioEventLoopGroup初始化的过程
今天我们来讲讲Netty的启动流程,要理解Netty的启动流程,我们要理解NIO模型到Reactor模型,因为Netty的实现就是基于Reactor模型的。一个主selector线程用来监听所有客户端的连接,然后为对应的连接上来的客户端开辟一个selector线程来监听客户端的上的事件,进行相应的处理。这就是NIO的Reactor模型。但是在Netty中怎么实现的呢?就让我们走进Netty的源码世界,一探究竟。由于Netty的启动流程过于复杂。我们这篇博客只讲Netty启动流程中一小部分NioEvent原创 2020-08-13 23:29:18 · 1068 阅读 · 1 评论 -
Idea中编译Netty源码
今天我们来说说在Idea中如何编译Netty源码,因为之前我们介绍了Netty的使用方式,我们学一样的东西,不单单要会怎么用,我们还有知道它的原理。知道一个东西的原理,最好的方式就是阅读源码。所以我们今天来编译Netty的源码。笔者的开发环境如下:idea版本:2020.02netty版本:netty-4.1.51.Final首先我们要先去GitHub上下载对应的源码,具体地址:Netty源码,我们这儿的下载方式有很多种,笔者采用的方式就是直接下载,当然也是可以用命令git clone将源码给克隆原创 2020-08-09 10:50:48 · 1822 阅读 · 3 评论 -
基于Netty手动模拟聊天室和RPC
前面我们用了Java的NIO,但是非常的难用,尤其是ByteBuffer,几个指针很容易出错。于是有了Netty框架,Netty框架是对Java的NIO进行了封装,使Java的NIO更容易上手。Netty框架中没有使用NIO原生的ByteBuffer,而是使用新封装的ByteBuf,下面我们看看的ByteBuf的用法。废话不多说,直接上代码。import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import java.util原创 2020-07-30 16:12:17 · 312 阅读 · 0 评论