欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java nio基础使用示例

程序员文章站 2024-02-15 09:24:46
在jdk1.4中提出的技术,非阻塞io,采用的是基于事件处理方式。传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入。归纳为:1、java io...

在jdk1.4中提出的技术,非阻塞io,采用的是基于事件处理方式。
传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入。
归纳为:
1、java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了。
2、在1的基础上改进为,开设线程,serversocker.accept()后让线程去等待,但是当并发量高的时候,相当耗费资源的。
3、java nio为非阻塞,采用的是reactor反应堆模式,或者说observer观察者模式,监察io端口,注册事件到selector,当事件满足条件后触发行为。
大致流程为:
java nio提供一个selector,这个类似一个观察者,将需要探知的socketchannel注册到selector上
接着我们做别的事情,当有事件发生时候,selector会通知我们,传回一组selectionkey,我们读取这些key就会获得到我们刚刚注册过的socketchannel,然后从这个channel读取数据、处理业务逻辑。
selector内部原理,采用轮询的方式,对所注册的channel进行遍历,判断channel所注册的事件是否发生。
代码举例为:

复制代码 代码如下:

// 1.创建一个selector对象
selector selector = selector.open();
// 2.建立channel对象,并绑定在8080端口上
serversocketchannel ssc = serversocketchannel.open();
inetsocketaddress address = new inetsocketaddress(inetaddress.getlocalhost(),8080);
ssc.socket().bind(address);
// 3.将channel设定为非阻塞方式
ssc.configureblocking(false);
// 向selector注册channel以及我们感兴趣的事件
selectionkey skey = ssc.register(selector,selectionkey.op_accept);// 这边注册了accept,服务器接受到client连接事件
// 4、简单模拟下轮询过程
while(true)
{
  // selector通过select方法,通知我们感兴趣的事件发生了
  int nkeys = selector.select();
  // 当nkeys>0表示事件发生了
  // 这时候可以通过selector.selectedkeys();方法拿到key集合
  set selectkeys = selector.selectedkeys();
  // 5、迭代遍历keys对象,分别做适配业务逻辑处理
  // 比如:
  s = (selectionkey)(selectkeys.iterator()).next();
  if(s.isacceptable())// 判断为注册的op_accept事件
  {
    // 从channel中获取我们刚才注册的channel
    socket socket = ((serversocketchannel)s.channel()).accept().socket();
    socketchannel sc = socket.getchannel();
    // 设置为非阻塞
    sc.configureblocking(false);
  // 注册read/write事件
    sc.register(selector, selectionkey.op_read |selectionkey.op_write);
  }
}
// 上边就是简单的java nio演示的伪代码
// 这时候,client端可以telnet 主机名 端口号 连接到server服务器。