java nio的使用_java nio基础使用示例

在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服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值