点击上方“JavaEdge”,关注公众号
设为“星标”,好文章不错过!![1f6b4d3baf017ca76be2e3276c04f7c9.png](https://i-blog.csdnimg.cn/blog_migrate/c7428b2e2e6b6c4034b13d8c7d4b227d.png)
1 传统socket网络编程
![eb418f27de62e18b95f9231fb0fe24bb.png](https://i-blog.csdnimg.cn/blog_migrate/19f27159a8c6575a3855417bf927763f.png)
1.1 实战
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
服务端:ServerBoot
Server
ClientHandler
客户端:Client
先后启动
ServerBoot
、Client
,分别输出如下:
1.2 传统HTTP服务器原理
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
创建一个
ServerSocket
监听并绑定一个端口一系列客户端来请求这个端口服务器使用Accept,获得一个来自客户端的Socket连接对象
启动一个新线程处理连接读Socket,
得到字节流解码协议
得到Http请求对象处理Http请求
得到一个结果
封装成一个HttpResponse对象编码协议
将结果序列化字节流写Socket
将字节流发给客户端
继续循环步骤3
1.3 C/S 交互流程
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
![1f6b4d3baf017ca76be2e3276c04f7c9.png](https://i-blog.csdnimg.cn/blog_migrate/c7428b2e2e6b6c4034b13d8c7d4b227d.png)
2 Netty版socket网络编程
![eb418f27de62e18b95f9231fb0fe24bb.png](https://i-blog.csdnimg.cn/blog_migrate/19f27159a8c6575a3855417bf927763f.png)
下面分别介绍图中对应组件。
![1f6b4d3baf017ca76be2e3276c04f7c9.png](https://i-blog.csdnimg.cn/blog_migrate/c7428b2e2e6b6c4034b13d8c7d4b227d.png)
3 Netty核心组件
![eb418f27de62e18b95f9231fb0fe24bb.png](https://i-blog.csdnimg.cn/blog_migrate/19f27159a8c6575a3855417bf927763f.png)
3.1 NioEventLoop
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
![0cb84da3195435aad538b2d57211f091.png](https://i-blog.csdnimg.cn/blog_migrate/650be1e085361b85530e96fa4d09b297.png)
3.1.1 简介
![788ee76f82c9998972b12478806b9292.png](https://i-blog.csdnimg.cn/blog_migrate/f6487b61d8df392c60359785e5603f84.png)
![21d7c68c8de6663b35cfdc1c9250bbc6.png](https://i-blog.csdnimg.cn/blog_migrate/25fcefce8ffcb71cc6c93d54c18fda9c.png)
EventLoop,其实一个 eventloop 就是一个 eventexecutor ![f2f9390767ecfc0b5c3aa889b4b52189.png](https://i-blog.csdnimg.cn/blog_migrate/81cead8e3c95d9efce95d950453aae39.png)
NioEventLoopGroup
是一个处理 I/O 操作的多线程事件循环。Netty 为不同类型传输提供各种 EventLoopGroup
实现。在此示例中,我们实现服务器端应用程序,因此将使用两个 NioEventLoopGroup。第一个,通常称为'boss',接受传入的连接。第二个(通常称为'工作人员')在上司接受连接并登记到工作人员后处理接受连接的流量。使用多少线程以及如何映射到创建的通道取决于 EventLoopGroup 实现,甚至可能通过构造函数进行配置。
作为Netty的发动机
Server端
Client端
while(true)
就对应一个 run 方法
NioEventLoop#run
netty有不同的io编程模型实现。
以NIO为例,对IO事件的处理是在NioEventLoop里做的,事件的注册在下面的方法
不同事件调用unsafe的不同方法,netty对底层socket的操作都是通过unsafe来做的 unsafe主要由两种不同的实现:
NioMessageUnsafe
NioServerSocketChannel
使用的是NioMessageUnsafe来做socket操作NioByteUnsafe
NioSocketChannel
使用NioByteUnsafe来做socket操作
处理每一个连接
EventExecutorGroup
EventExecutorGroup
负责经由其使用next()
方法提供EventExecutor
。除此之外,还负责处理自己的生命周期,并允许在全局模式中关闭它们。
EventExecutor
该EventExecutor
是个特殊的EventExecutorGroup
,附带一些快捷方法,看是否有Thread
在事件循环执行。除此之外,它还继承了EventExecutorGroup
以允许通用的方法来访问。
eventloopGroup
特殊的 EventExecutorGroup
,它允许注册 Channel
,即事件循环期间可以执行 channel 操作,得到处理,供以后选用
3.2 Channel
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
以服务端的NioMessageUnsafe为例来看下read()方法的实现,对应是否有新连接进来的情况
直接把底层的 channel 封装成 NioSocketChannel
3.3 ByteBuf
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
3.4 Pipeline
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
netty 将其抽象成逻辑链,看看 netty 是怎么把每个 pipeline 加入到客户端连接的
3.5 ChannelHandler
![a422190cf3352c0e4df06f9fb868e1ca.png](https://i-blog.csdnimg.cn/blog_migrate/cc404ced61ccb489528556c44dedc1c6.png)
往期推荐
阿里P8架构师教你kill代码重复/大量ifelse
一文讲清RedisCluster
阿里Java架构师教你写代码-如何校验参数?
你真的深知JWT(JSON Web Token)了吗?
OAuth 2.0实战(一)-通俗光速入门
![88f2f5854da96a1f9914d52ce2d56609.gif](https://i-blog.csdnimg.cn/blog_migrate/d48637533e868d1cdc0c940b2620c7a9.gif)
目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~