java NIO及NIO聊天室

本文介绍了Java NIO的重点内容,并通过实例展示了如何使用NIO构建一个多人聊天室。参考了相关链接,包括一个基础的NIO实例和一个具体的NIO聊天室实现。
摘要由CSDN通过智能技术生成

参考链接:

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不能切换到非阻塞模式。而套接字通道都可以。

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值