Netty
What is Netty?
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

Unix 提供的5种I/O模型:
- 阻塞I/O模型:
- 非阻塞I/O模型:
- I/O复用模型:
- 信号驱动模型:
- 异步I/O:
NIO服务端时序图
1 2 3 4 5 6 7 8 9 10 11
| NioServer->NioServer: 1.打开ServerSocketChannel NioServer->NioServer: 2.绑定监听地址InetSocketAddress Reactor Thread->Reactor Thread: 3.创建Selector,启动线程 NioServer->Reactor Thread: 4.将ServerSocketChannel注册到Selector,监听SelectionKey.OP_ACCEPT Reactor Thread->Reactor Thread:5.Selector轮询就绪的Key IoHandler->Reactor Thread: 6.handlerAccept()处理新的客户端接入 IoHandler->IoHandler: 7.设置新客户端连接的Socket参数 IoHandler->Reactor Thread:8.向Selector注册监听读操作SelectionKey.OP_READ Reactor Thread->IoHandler: 9.handleRead()异步读消息到ByteBuffer IoHandler->IoHandler: 10.decode请求消息 IoHandler->Reactor Thread: 11.异步写ByteBuffer到SocketChannel
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| ServerSocketChannel acceptorSvr = ServerSocketChannel.open();
acceptorSvr.socket().bind(new InetSocketAddress(InetAddress.getByName("IP"),port)); acceptorSvr.configureBlocking(false);
Selector selector = Selector.open(); New Thread(new ReactorTask()).start();
SelectionKey key = acceptorSvr.register(selector,SelectionKey.OP_ACCEPt,ioHandler);
int num = selector.select(); Set selectedKeys = selector.selectedKeys(); Iterator it = selectedKeys.iterator(); while(it.hasNext()){ SelectionKey key = (SelectionKey)it.next(); }
SocketChannel channel = svrChannel.accept();
channel.configureBlocking(false); channel.socket().setReuseAddress(true);
SelectionKey key = socketChannel.register(selector,SelectionKey.OP_READ,ioHandler);
int readNumber = channel.read(receivedBuffer);
Object message = null; while(buffer.hasRemain()){ byteBuffer.mark(); Object message = decode(byteBuffer); if(message == null){ byteBuffer.reset(); break; } messageList.add(message); } if(!byteBuffer.hasRemain()){ byteBuffer.clear(); }else{ byteBuffer.compact(); } if(messageList !=null &!messageList.isEmpty()){ for(Object messageE : messageList){ handlerTask(messageE); } }
socketChannel.write(buffer);
|
NIO客户端时序图
1 2 3 4 5 6 7 8 9 10 11 12 13
| NioClient->NioClient:1.打开SocketChannel NioClient->NioClient:2.设置SocketChannel为非阻塞模式,同时设置TCP参数 NioClient->server:3.异步连接服务端 NioClient->NioClient:4.判断连接结果,如果连接成功,调到步骤10,否则执行步骤5 NioClient->Reactor Thread:5.向Reactor线程的多路复用器注册OP CONNECT事件 Reactor Thread->Reactor Thread:6.创建Selector,启动线程 Reactor Thread->Reactor Thread:7.Selector轮询就绪的Key Reactor Thread->IoHandler:8.handerConnect() IoHandler->IoHandler:9.判断连接是否完成,完成执行步骤10 IoHandler->Reactor Thread:10.向多路复用器注册读事件OP_READ Reactor Thread->IoHandler:11.handleRead()异步读请求消息到ByteBuffer IoHandler->IoHandler:12.decode请求消息 IoHandler->Reactor Thread:13.异步写ByteBuffer到SocketChannel
|