参考链接:
java NIO实例1:http://blog.chinaunix.net/uid-25808509-id-3346228.html
java NIO教程之selector(一系列): http://ifeve.com/selectors/java NIO与IO的比较: http://blog.csdn.net/keda8997110/article/details/19549493
JAVA NIO实例2: http://weixiaolu.iteye.com/blog/1479656
JAVA NIO教程(主要参考NIO和IO如何选择): http://www.iteye.com/magazines/132-Java-NIO
多人聊天室 IO: http://blog.csdn.net/baolong47/article/details/6735853
多人聊天室 NIO:http://www.cnblogs.com/yanghuahui/p/3686054.html
NIO重点摘要:
1.为了将Channel和Selector配合使用,必须将channel注册到selector上。
与Selector一起使用时,Channel必须处于非阻塞模式下。
这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以。
与Selector一起使用时,Channel必须处于非阻塞模式下。
这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以。
2.将ServerSocketChannel注册到上面的Selector上,需要什么事件?(下面服务端Channel是ServerSocketChannel类,客户端Channel是SocketChannel类)
2.1)服务端Channel只负责监听连接。所以服务端channel不用注册读写,注册了也会报错IllegalArgumentException。如:ssChannel.register(selector, SelectionKey.OP_ACCEPT|SelecionKey.OP_READ);
需要注册读写事件的是客户端channel;
2.2)客户端负责主动连接服务端,而双方的通信都是获取客户端channel完成的;
2.3)客户端channel如何在服务端注册呢?
在服务端监听连接处理块内注册,也就是循环处理块的if(selectKey.isAcceptable())块内。
3.每次处理完一个事件,很多代码还会调用selectionkey.interestOps()方法来设置下一次检测感兴趣的事件。但如果事件类型不变化,可以不用重复注册?
不用重复注册。socketChannel.register(selector, SelectionKey.OP_READ);语句到最后调用的是SelectionKey.interestOps(SelectionKey.OP_READ);语句。也就是说如果我们下次需要扫描的事件不变化,可以不用重复写SelectionKey.interestOps(SelectionKey.OP_READ)这句代码。显示的书写后面这句代码,是为了修改下次的扫描事件。
4.NIO的限制之一:NIO是基于缓存的,所以对通信双方每次的每次通信量有限制,要能提请预判。
如果一个channel需要重复使用一个Buffer,记得每次使用前用clear方法清空,否则会出现问题。至于为什么会出现问题,没细研究。
5.对于NIO,一般可用一个线程管理服务端,一个线程管理客户端。如果客户端数量非常多,NIO的瓶颈在哪里?
未解决……
6.N