回顾NIO编程
NIO编程需要掌握Selector,需要掌握channel,buffer
多路复用器Selector有很多Channel注册信息和每个Channel对应感兴趣的事件operation,用SelectionKey代表
selector调用select()方法,阻塞获取有IO信息并且是感兴趣的 SelectionKey
对SelectionKey进行处理,获取key的channel,通过read读取数据,write写出数据,此时就会用到buffer,这个buffer有他自己的数据结构,类似数组,它的读写指针都是position,可以设置不可读写区域的索引(capacity-limit),也可以标记,用来回读或回写
1 | Server |
总结:
NIO原生API编程,需要了解网络编程的一系列知识,需要时刻盯着buffer的position和limit,因为你可能一不小心就会把 不需要写出去或者读进来的字节 给写了出去或者读了进来 ,坑爹吧,然后还要手动管理channel 连接,发数据或者读数据,关闭 的流程,可能还需要去自己编码,解码一个其他的协议,等等,还有很多需要考虑的地方
NIO对于新手编程来说非常不友好,所以netty这个NIO框架诞生了,我们只需要搞懂API,其他的安全性管理,buffer指针,编码解码啥的,不需要管,交给netty
Netty
入门首先就是得会用
开源得netty再github上给你使用的例子 https://github.com/netty/netty/tree/4.1/example
官方使用指南 https://netty.io/wiki/user-guide-for-4.x.html
1 | //编写一个收到任何数据不做任何响应的服务器,这是最简单的一个服务 |
编程
其实我们对netty的编程其实就是对ChannelHandler的编程,ChannelHandler的方法都由netty的EventLoop的线程进行回调
例如
NioEventLoop的线程的run方法主要的活
1 |
|
两个重要的ChannelHandler
netty的ChannelInboundHandler
1 | //{@link ChannelHandler}为Channel状态更改添加的回调方法。这允许用户轻松地知道 到状态更改。 |
netty的ChannelOutboundHandler
1 | //{@link ChannelHandler}将收到IO出站操作的通知。 |
两个必须的ChannelHandlerContext
HeadContext
他会做pipeline 出战操作的 传播 事件的最后的默认实现
1 | final class HeadContext extends AbstractChannelHandlerContext |
TailContext
入站 传播事件的 默认实现
1 | final class TailContext extends AbstractChannelHandlerContext implements ChannelInboundHandler { |
入站和出站传播
1 |
|
信息读取和写出需要用到的ByteBuf
1 |
|
简单使用:
server
1 |
|
client
1 |
总结:
一个channel应该被注册到 一个EventLoop, 此后该Channel的IO操作都由此 EventLoop去执行
一个Channel应该有一个ChannelPipeline对象 ,这个 ChannelPipeline对象 可以对IO操作结果进行 多重的处理
在多重处理时 引入了一个 ChannelHandlerContext的对象, ChannelHandlerContext看名字就知道是一个ChannelHandler对象的上下文对象, 那么这个上下文对象 包含了 ChannelHandler对象引用,也包含了所属ChannelPipeline对象的引用,还包含 ChannelHandlerContext对象在 事件传播或者事件执行时 的执行者EventExecutor引用,如果此引用为空,事件传播或者事件执行时则使用所属pipeline的channel的 IO事件执行器EventLoop,
这里我认为的事件 叫做 一个IO操作的结果
对应的IO操作完成,pipeline就会对此IO操作完成信息进行事件传播,pipeline的链表上的 ChannelHandlerContext会取到ChannelHandler,使用对应的执行器 调用对应的回调方法
最难的是 netty的内存分配算法:还未搞懂
- 本文作者: 忘忧症
- 本文链接: https://NepenthesZGW.github.io/2020/06/20/framework/Netty/Netty基础学习/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!