• 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。在高并发的情况下,性能提高很大。

  • 相关阅读:
    项目积累——导出数据
    项目积累——POPUP
    项目积累——jQuery
    项目积累——集合相关知识
    项目积累——关于时间显示和格式的几种方式
    项目积累——综合
    项目积累——js应用
    项目积累——CSS应用

    平衡二叉树
  • 原文地址:https://www.cnblogs.com/onlywujun/p/2788309.html
Copyright © 2020-2023  润新知