乐趣区

netty学习总结(一)

netty 学习总结(一)
netty 是什么?
netty 是一个异步的,事件驱动的网络编程框架。
netty 的技术基础
netty 是对 Java NIO 和 Java 线程池技术的封装
netty 解决了什么问题
使用 Java IO 进行网络编程,一般一个用户一个线程,无法处理海量用户使用 Java NIO 进行网络编程,编程复杂性太高,如果没有深厚的 NIO 网络编程基础,写出的程序可能还不如 Java IO 写的程序至于 Java AIO,目前还没有弄清楚其与 netty 孰优孰劣
netty 架构
netty 架构是基于 Reactor 和责任链模式进行设计的。
reactor
关于 reactor 的原理,参考“【NIO 系列】——之 Reactor 模型”netty 的 reactor 是多 reactor 多线程模型,其中 reactor 在 netty 中以 eventloop 的形式出现。
责任链模式
netty 通过 popeline 将 handler 组装起来,通过向 pipeline 里添加 handler 来监听处理发生的事件。
netty 服务端编程模式
// 用于监听客户端链接的 eventloop 池,一般只有一个 eventloop
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
// 用于处理客户端 IO 的 eventloop 池
NioEventLoopGroup workGroup = new NioEventLoopGroup();
// 辅助类,帮助初始化服务器
ServerBootStrap bootstrap = new ServerBootStrap();
bootstrap.group(bossGroup, workGroup) // bossGroup 和 workGroup 可以是同一个
.channel(NioServerSocketChannel.class) // 设置服务端监听套接字的 channel 类型
.option(ChannelOption.SO_BACKLOG, 1024) // 设置监听套接字的参数
.handler(new LoggingHandler()) // 设置监听套接字的 handler
.childHandler(new ChannelInitializer<SocketChannel>(){
// 设置客户端套接字的 handler
public void initChannle(SocketChannel ch){
// 向 pipleline 中添加 handler,用于处理客户端 IO
ch.pipeline().addLast(…);
}
});
int port = 8080;
try{
ChannelFuture f = bootstrap.bind(port).sync();
f.channel().closeFuture().sync();
}catch(IOException e){
e.printStacktrac();
}finally{
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
netty 客户端编程模型
// 用于处理与服务端 IO 的 eventloop 池
NioEventLoopGroup group = new NioEventLoopGroup();
// 辅助类,帮助初始化客户端
BootStrap bootstrap = new BootStrap();
bootstrap.group(group)
.channel(NioSocketChannel.class) // 设置客户端套接字的 channel 类型
.option(ChannelOption.NO_DELAY, true) // 设置客户端套接字的参数
.handler(new ChannelInitializer<SocketChannel>(){
// 设置客户端套接字的 handler
public void initChannel(SocketChannel ch){
// 向 pipleline 中添加 handler,用于处理客户端 IO
ch.pipeline().addLast(…);
}
});
String host = “127.0.0.1”;
int port = 8080;
try{
ChannelFuture f = bootstrap.connect(host, port).sync();
f.channel().closeFuture().sync();
}catch(IOException e){
e.printStacktrac();
}finally{
group.shutdownGracefully();
}
buffer
netty 认为 Java NIO 的 Buffer 太难用了,因此自己实现了一套 Buffer。相比于 Java NIO 的 netty 的 buffer 不仅易用,而且还支持自动扩容。
netty 的 buffer 可以抽象为三个指针 readIndex, writeIndex, limit. 读 buffer 增加 readIndex,写 buffer 会增加 writeIndex,如果写的数据量超过 limit, 则会增加 buffer 容量。netty buffer 也支持随机读写
netty 中 buffer 一般通过 Unpooled 工具类创建,有三大类 buffer:

在 JVM 堆上分配的 buffer。优点是分配快速,易于回收,缺点是最终还是要将数据复制到直接缓存中
直接缓冲区,直接通过系统调用 malloc 分配的内存,优点是减少数据移动,缺点是分配慢,回收麻烦
组合缓冲区,即将不同种类的 buffer 进行封装,访问时就像访问一个 buffer,可以通过这个方式对缓冲区进行划分,但是会增加访问时间

handler
handler 分为处理入站事件的 handler 和出站事件的 handler。通过实现相应的方法来监听相应的事件 netty 也提供了一些 adapter 类来减少开发者的工作量。
入站 handler
入站事件一般是由外部触发的,如收到数据。基类为 ChannelInboundHandler
出栈 handler
出站事件由内部触发,如写数据基类为 ChannelOutboundHandler

退出移动版