zoukankan      html  css  js  c++  java
  • JAVA NIO API 学习

    Java NIO非堵塞技术采用的是Reactor模式,或者说是Observer模式,为我们检查I/O端口。如果有内容进来,会自动通知我们,这样,我们就不必开多个线程四等。从外界看,实现了流畅的I/O读写,不堵塞了。

    NIO中的主要类之一Selector,这个类类似一个观察者,只要我们把要探知的SocketChannel告诉Selector,我们接着做别的事儿,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据。

    Selector内部原理实际是在做一个对所有注册的Channel的轮询访问,不断地轮询(目前就这一个算法),一旦轮训到一个channel有所注册过的事件发生,比如数据来了,他就会站出来报告,交出一把要是,让我们通过这个要是来读取这个Channel的内容。 选择器(Selector)的作用是:将通道感兴趣的事件放入队列中,而不是马上提交给应用程序,等已注册的通道自己来请求处理这些事件。换句话说,就是选择器将会随时报告已经准备好了的通道,而且是按照先进先出的顺序。那么,选择器是通过什么来报告的呢?选择键(SelectionKey)。选择键的作用就是表明哪个通道已经做好了准备,准备干什么。你也许马上会想到,那一定是已注册的通道感兴趣的事件。不错,例如对于服务器端serverChl来说,可以调用key.isAcceptable()来通知serverChl有客户端连接请求。相应的函数还有:SelectionKey.isReadable(),SelectionKey.isWritable()。一般的,在一个循环中轮询感兴趣的事件(具体可参照下面的代码)。如果选择器中尚无通道已注册事件发生,调用Selector.select()将阻塞,直到有事件发生为止。另外,可以调用selectNow()或者select(long timeout)。前者立即返回,没有事件时返回0值;后者等待timeout时间后返回。一个选择器最多可以同时被63个通道一起注册使用。

    ServerSocketChannel和SocketChannel,他们都是可选择的(Selectable)通道,分别可以工作在同步和异步两种方式,而是指可以有选择的注册自己感兴趣的事件)。可以用channel,configureBlocking(Boolean)来设置其工作方式。与以前版本的API相比较,ServerSocketChannel就相当于ServerSocket (ServerSocketChannel封装了ServerSocket),而SocketChannel就相当于Socket(SocketChannel封装了Socket).当通道工作在同步方式时,编程方法与以前的基本相似。

    在服务器端,ServerSocketChannel通过静态函数open()返回一个实例serverChl。然后该通道调用serverChl.socket().bind()绑定到服务器某端口,并调用registerSelector sel, SelectionKey.OP_ACCEPT)注册OP_ACCEPT事件到一个选择器中(ServerSocketChannel只可以注册OP_ACCEPT事件)。当有客户请求连接时,选择器就会通知该通道有客户连接请求,就可以进行相应的输入输出控制了;在客户端,clientChl实例注册自己感兴趣的事件后(可以是OP_CONNECT,OP_READ,OP_WRITE的组合),调用clientChl.connect (InetSocketAddress )连接服务器然后进行相应处理。注意,这里的连接是异步的,即会立即返回而继续执行后面的代码

     所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞(None Blocking)。

    举个例子:普通B/S模式(同步)AJAX技术(异步)           

    同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事           

    异步:  请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

    同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。 

    异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。 

    所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。

  • 相关阅读:
    Powerdesigner SqlServer转Oracle(转)
    ASP.NET jquery.uploadify上传控件中文乱码解决办法(转)
    网页上显示数学公式目前哪种方案最好? 来自知乎
    sql server 自增长id 允许插入显示值
    (转)【深入浅出jQuery】源码浅析2--奇技淫巧
    (转)js activexobject调用客户机exe文件
    搞笑代码注释,佛祖保佑 永无BUG
    json 递归查找某个节点
    c# string.format json字符串 formatException错误
    验证list的底层数据结构
  • 原文地址:https://www.cnblogs.com/michelleAnn2011/p/2427484.html
Copyright © 2011-2022 走看看