异步
等待它的同时你也可以做点别的事情
阻塞I/O
只能同时处理一个连接,要管理多个并发客户端,需要为每个新的客户端Socket创建一个新的Thread
使用Selector的非阻塞I/O
class java.nio.channels.Selector
是Java的非阻塞I/O实现的关键。它使用了事件通知API以确定在一组非阻塞套接字中有哪些已经就绪能够进行I/O相关的操作。因为可以在任何的时间检查任意的读操作或者写操作的完成状态,一个单一的线程便可以处理多个并发的连接。
Channel
Channel 是 Java NIO 的一个基本构造。
它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执
行一个或者多个不同的I/O操作的程序组件)的开放连接,如读操作和写操作
目前,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以
被打开或者被关闭,连接或者断开连接。
Future
Future
提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操
作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
ChannelFuture
提供了几种额外的方法,这些方法使得我们能够注册一个或者多个
ChannelFutureListener
实例。监听器的回调方法operationComplete()
,将会在对应的
操作完成时被调用。
简而言之,由ChannelFutureListene
r提供的通知机制消除
了手动检查对应的操作是否完成的必要。
每个 Netty 的出站 I/O 操作都将返回一个 ChannelFuture;也就是说,它们都不会阻塞。
正如我们前面所提到过的一样,Netty 完全是异步和事件驱动的。
pipeline
Each channel has its own pipeline and it is created automatically when a new channel is created.
Channel的注冊
在 Netty 中, 每个 Channel 都会关联一个特定的 EventLoop, 并且这个 Channel 中的所有 IO 操作都是在这个 EventLoop 中执行的;
bossGroup
bossGroup 是用于服务端 的 accept 的, 即用于处理客户端的连接请求
workerGroup
workerGroup 负责客户端连接通道的 IO 操作