the reactor pattern and java nio
在《java NIO》作者PPT《How to Build a Scalable Multiplexed Server With NIO》 和 Doug Lea 《Scalable IO in Java》PPT中
都有java nio的实现是通过reactor pattern 来实现的有说明。java nio作为一种跨平台IO操作。
在不同平台上面封装了相应平台的IO模型。
在reactor pattern 作者中已经提及,通过reactor pattern 模式能够来实现跨平台操作。
所以,java nio通过reactor pattern模式就是这样完毕的。
java nio在window 平台以下是使用Select 模型。
对于java nio源码的分析。对于假设理解reactor pattern的设计模式意义不大。
由于java nio实现中
须要对JNI的封装。假设要了解对于不同平台的封装,能够通过ZThead库来了解会有更大的意义。
这样能够避免对JNI 的干扰。
由于JNI涉及到脚本语言java和C/C++交互的知识。
How to Build a Scalable Multiplexed Server With NIO
Reactor Pattern Mapped to NIO
Handle
SelectionKey
Event
SelectionKey.OP_READ, etc
Demultiplexer
Selector
Dispatcher
Selector.select() + iterate Selector.selectedKeys()
Handler
An instance of Runnable or Callable
最简单样例:TestReactor.java
public class TestReactor
{ public static void main(String[] args) throws Exception
{ //创建serversocketchannel通道.
ServerSocketChannel serversocketchannel =ServerSocketChannel.open();
//设置非堵塞,异步模式
serversocketchannel.configureBlocking(false);
//关联的serversocket
ServerSocket serversocket = serversocketchannel.socket();
SocketAddress endpoint =new InetSocketAddress("127.0.0.1", 8888);
//绑定指定的port
serversocket.bind(endpoint);
//创建Selector。 在Reactor Pattern模式中,相当于Demultiplexer 作用,用来多路复用器
Selector sel = Selector.open();
//在select中注冊链接事件。
//在reactor 模式中SelectionKey 相当于event事件。
//在SectionKey中存在OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT 事件类型。此时与OP_ACCEPT 关联的Channel为ServerSocketChannel
SelectionKey selKey = serversocketchannel.register(sel, SelectionKey.OP_ACCEPT);
while(true)
{
//进行堵塞操作,等待事件的到来。返回值在select 模型中表示完毕操作的数目
int selCount = sel.select();
if(selCount>0)
{
System.out.println("selCount=>>"+selCount);
}
//返回能够操作的键集合。在window select 模型中,返回能够操作的fd_set集合
Set<SelectionKey> selKeySet = sel.selectedKeys();
for(SelectionKey key:selKeySet)
{ //在SelectionKey中,存在链接能够接受事件,则调用accept()函数就不会存在堵塞现象。 //select
if(key.isAcceptable())
{
//获取与SelectionKey.OP_ACCEPT关联的通道。即ServerSocketChannel.
ServerSocketChannel serverChannel = (ServerSocketChannel)key.channel();
//调用ServerSocketChannel 不会发生堵塞。 获取到客户链接
SocketChannel socketchannel = serverChannel.accept();
//设置堵塞模式
socketchannel.configureBlocking(false);
//关联SocketChannel的读和写事件
socketchannel.register(sel, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
//同一时候能够在SelectionKey中关联其它对象。在Select 模式中。Selectionkey 相当于Completionkey參数
}
if(key.isWritable())
{
SocketChannel socketchannel = (SocketChannel)key.channel();
ByteBuffer src =ByteBuffer.allocate(100);
src.putInt(100);
src.flip();
socketchannel.write(src);
//关联SocketChannel的读和写事件
socketchannel.register(sel, SelectionKey.OP_READ);
//同一时候能够在SelectionKey中关联其它对象。 在Select 模式中,Selectionkey 相当于Completionkey參数 }
if(key.isReadable())
{
SocketChannel socketchannel = (SocketChannel)key.channel();
InetSocketAddress remote = (InetSocketAddress)socketchannel.getRemoteAddress();
String remotestring = remote.getHostString()+remote.getPort();
//关联SocketChannel的读和写事件
socketchannel.register(sel, SelectionKey.OP_WRITE);
//同一时候能够在SelectionKey中关联其它对象。在Select 模式中,Selectionkey 相当于Completionkey參数
}
selKeySet.remove(key);
} } }
}
the reactor pattern and java nio的更多相关文章
- reactor模式与java nio
Reactor是由Schmidt, Douglas C提出的一种模式,在高并发server实现中广泛採用. 改模式採用事件驱动方式,当事件出现时,后调用对应的事件处理代码(Event Handl ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- Java NIO 与 基于reactor设计模式的事件处理模型
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...
- java NIO的多路复用及reactor模式【转载】
关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...
- java NIO中的Reactor相关知识汇总 (转)
一.引子 nio是java的IO框架里边十分重要的一部分内容,其最核心的就是提供了非阻塞IO的处理方式,最典型的应用场景就是处理网络连接.很多同学提起nio都能说起一二,但是细究其背后的原理.思想往往 ...
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...
- 3、谈谈 Java NIO
在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New,原因在于它相对于之前的 IO 类库是新增的.此外,旧的 IO 类库提供的 ...
- 笔记-reactor pattern
笔记-reactor pattern 1. reactor模式 1.1. 什么是reactor模式 The reactor design pattern is an event han ...
- Reactor Pattern and Non-blocking IO--reference
reference from:http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html ...
随机推荐
- Android 利用 AsyncTask 异步读取网络图片
1.新建Android工程AsyncLoadPicture 新建布局文件activity_main.xml主界面为一个GridView,还有其子项布局文件gridview_item.xml 2.功能主 ...
- maven构建的模块化的JavaWeb工程
最近对maven构建的模块化的JavaWeb工程,比较感兴趣,所以自己就想从头弄一个出来,在此做一个记录,供以后学习. 前置条件:电脑上有eclipse(或者myeclipse,记事本也可以,那样就得 ...
- POJ1273 Drainage Ditches (网络流)
Drainage Ditches Time Limit: 1000MS Memor ...
- x-pack-crack
破解x-pack-----------1. 编辑文件:LicenseVerifier.javapackage org.elasticsearch.license;import java.nio.*;i ...
- String format -1 常规格式化
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的读者应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- pyttsx的中文语音识别问题及探究之路
最近在学习pyttsx时,发现中文阅读一直都识别错误,从发音来看应该是字符编码问题,但搜索之后并未发现解决方案.自己一路摸索解决,虽说最终的原因非常可笑,大牛们可能也是一眼就能洞穿,但也值得记录一下. ...
- 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数 ...
- java随机生成字符串(字符随机生成类 生成随机字符组合)
原文:http://www.jb51.net/article/45006.htm package p2p_web; import java.util.ArrayList; import java.ut ...
- vsftp 服务配置
在CentOS或者RedHat Linux上有自带的ftp软件叫做vsftpd (very serure ftp) 搭建vsftpd 服务 yum 安装需要用两个包:vsftpd 和 db4-util ...