构造函数
![img_ad7ac1ede3581c482eb653cf9c53fa1f.png](https://i-blog.csdnimg.cn/blog_migrate/bcd39cc0d5108cacfabf7f6c94651f08.png)
![img_5dbddc9e816c9c628707646ca69c4eed.png](https://i-blog.csdnimg.cn/blog_migrate/63bf70528c4714e99e01a222f0f15c37.png)
![img_766849c22e5db03a6411e53abbfb6734.png](https://i-blog.csdnimg.cn/blog_migrate/9b43f9ff01c6e2648830ec8a313601fc.png)
![img_6298c2995ab995cc8e08a209c0856656.png](https://i-blog.csdnimg.cn/blog_migrate/ca68c41c8c9c293e431c03828cd61bac.png)
![img_042bf1fff8e95e2337f5e2c0dd89a3fd.png](https://i-blog.csdnimg.cn/blog_migrate/8669e8ae05a732794eea62bed3cb84e5.png)
首先放一个NIO的使用流程
1、创建ServerSocketChannel,配置为非阻塞模式
2、绑定监听,配置TCP参数,例如backlog大小;
3、创建一个独立的IO线程,用于轮询多路复用器Selector;
4、创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKey.ACCEPT
5、启动IO线程,在循环体中之行Selector.select()方法,轮询就绪的Channel;
6、当轮训到了处于就绪状态的channel时,需要对其进行判断,如果是OP_ACCEPT状态,说明是新的客户端接入,则调用ServerSocketChannel.accept()方法接受新的客户端;
7、设置新借入的客户端链路SocketChannel为非阻塞模式,配置其他的一些TCP
8、将SocketChannel注册到Selector,监听OP_READ操作位;
9、如果轮训的Channel为OP_READ,则说明SocketChannel中,有心得就绪的数据包需要读取,则构造ByteBuffer对象,读取数据包;
10、如果轮训的Channel为OP_WRITE,说明还有数据没有发送完成,需要继续发送