一个socket由一个线程处理,大量socket引起创建大量线程。
数据读写是以字节流为单位,效率不高
Channel 是 NIO 基本的结构。它代表了一个用于连接到实体如硬件设备、文件、网络套接字或程序组件,能够执行一个或多个不同的 I/O 操作(例如读或写)的开放连接。
callback (回调) 是一个简单的方法,提供给另一种方法作为引用,这样后者就可以在某个合适的时间调用前者。这种技术被广泛使用在各种编程的情况下,最常见的方法之一通知给其他人操作已完成。(一些handler)
Future 提供了另外一种通知应用操作已经完成的方式。这个对象作为一个异步操作结果的占位符,它将在将来的某个时候完成并提供结果。JDK 附带接口 java.util.concurrent.Future ,但所提供的实现只允许您手动检查操作是否完成或阻塞了。这是很麻烦的,所以 Netty 提供自己了的实现,ChannelFuture,用于在执行异步操作时使用。
客户端连接服务器,是由bossGroup建立连接。建立连接后,客户端往服务器发送数据由workGroup执行pipeline中一系列handler进行业务处理。
BossGroup
主Reactor的线程池,负责处理建立连接
WorkerGroup
从Reactor的线程池,负责处理客户端的其他事件如读、写,调用相应的handler
认识Netty的ChannelHandler 和 ChannelPipeline
ChannelPipeline 就是 ChannelHandler 链的容器。 当 ChannelHandler 被添加到的 ChannelPipeline 它得到一个 ChannelHandlerContext,它代表一个 ChannelHandler 和 ChannelPipeline 之间的“绑定”。它通常是安全保存对此对象的引用,除了当协议中的使用的是不面向连接(例如,UDP)。而该对象可以被用来获得 底层 Channel,它主要是用来写出站数据。
一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的双向链表,并且每个ChannelHandlerContext中又关联着一个ChannelHandler。入站事件和出站事件在一个双向链表中,入站事件会从链表head往后传递到最后一个入站的handler,出战事件会从链表tail往前传递到最前一个出站的handler,两类型的handler互不干扰。