zoukankan      html  css  js  c++  java
  • 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。在高并发的情况下,性能提高很大。

  • 相关阅读:
    置换群
    背包问题
    并查集
    链式前向星
    一个简单的金额平均分配函数(C#版)
    EasyUI ComboGrid的绑定,上下键和回车事件,输入条件查询
    Oracle表解锁语句
    如何将两个json合并成一个
    textbox只能输入数字或中文的常用正则表达式和验证方法
    C#注册表的读,写,删除,查找
  • 原文地址:https://www.cnblogs.com/onlywujun/p/2788309.html
Copyright © 2011-2022 走看看