NIO服务器个人理解

1.服务端注册一个serverSocketChannel(确定好服务器IP和端口号)到Selector上,监听accept事件。

2.Selector不断的轮询看有没触发监听的事件,这里就是有没接受到到这个socket的请求。有了就找出SelectionKey。这时的SelectionKey对应的是服务端的serverSocketChannel 

ServerSocketChannel ssc = (ServerSocketChannel) key.channel();  

3.取的客户端发请求的SocketChannel socket = (SocketChannel) ssc.accept();  

4.监听这个客户端的channel的读事件 socket.configureBlocking(false);   socket.register(selector, SelectionKey.OP_READ);  

后面就是发请求之后的业务处理了。

 

---------------------------------------

nio中取得事件通知,就是在selector的select事件中完成的,在selector事件时有一个线程,这个线程具体的处理简单点说就是:向操作系统询问,selector中注册的Channel&&SelectionKey的偶对各种事件是否有发生,如果有则添加到selector的selectedKeys属性Set中去,并返回本次有多少个感兴趣的事情发生。程序员发现这个值>0,表示有事件发生,马上迭代selectedKeys中的SelectionKey,根据Key中的表示的事件,来做相应的处理。

实际上,这段说明表明了异步socket的核心,即异步socket不过是将多个socket的调度(或者还有他们的线程调度)全部交给操作系统自己去完成,异步的核心Selector,不过是将这些调度收集、分发而已。因为操作系统的socket、线程调度再咋D也比你JVM中要强,效率也高。

而且就算jvm做的和操作系统一样好,性能一样高(当然这是不现实的),使用异步socket你至少也节约了一半的系统消耗,想想假定操作系统本身也是使用线程来维护N个socket连接,在传统的java编程中,你还必须为这些socket还多起一个java线程,那至少是2N个线程,现在只需要N+1。在高并发的情况下,性能提高很大。

posted @ 2012-11-25 22:52  寂静沙滩  阅读(272)  评论(0编辑  收藏  举报