总言:netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架。
准备知识:IO,NIO
下面介绍四种I/O模型。
1、阻塞I/O模型:缺省情况下所有文件操作都是阻塞的。当一个线程去读取某个缓冲区时,如果缓冲区没有数据,那么这个线程会一致等待下去,这就是阻塞I/O。
伪代码如下:
{
// read阻塞
read(socket, buffer);
// 处理buffer
process(buffer);
}
伪代码如下:
{
// read非阻塞
while(read(socket, buffer) != SUCCESS);
process(buffer);
}
伪代码如下:
{
// 注册
select(socket);
// 轮询
while(true) {
// 阻塞
sockets = select();
// 数据到达, 解除阻塞
for(socket in sockets) {
if(can_read(socket)) {
// 数据已到达, 那么socket阻不阻塞无所谓
read(socket, buffer);
process(buffer);
}
}
}
}
IO多路复用是最常使用的IO模型,因其轮询select的线程会被阻塞, 异步程度还不够“彻底”, 所以常被称为异步阻塞IO
伪代码如下:
// 继承CompletionHandler, buffer为用户线程指定的缓冲区
void UserCompletionHandler::handle_event(buffer) {
process(buffer);
}
// 调用异步的read函数
{
aio_read(socket, new UserCompletionHandler);
}