在《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的更多相关文章

  1. reactor模式与java nio

     Reactor是由Schmidt, Douglas C提出的一种模式,在高并发server实现中广泛採用. 改模式採用事件驱动方式,当事件出现时,后调用对应的事件处理代码(Event Handl ...

  2. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  3. Java NIO 与 基于reactor设计模式的事件处理模型

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...

  4. java NIO的多路复用及reactor模式【转载】

    关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...

  5. java NIO中的Reactor相关知识汇总 (转)

    一.引子 nio是java的IO框架里边十分重要的一部分内容,其最核心的就是提供了非阻塞IO的处理方式,最典型的应用场景就是处理网络连接.很多同学提起nio都能说起一二,但是细究其背后的原理.思想往往 ...

  6. Java NIO学习与记录(八): Reactor两种多线程模型的实现

    Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...

  7. 3、谈谈 Java NIO

    在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New,原因在于它相对于之前的 IO 类库是新增的.此外,旧的 IO 类库提供的 ...

  8. 笔记-reactor pattern

    笔记-reactor pattern 1.      reactor模式 1.1.    什么是reactor模式 The reactor design pattern is an event han ...

  9. Reactor Pattern and Non-blocking IO--reference

    reference from:http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html ...

随机推荐

  1. MSSQL-字符串分离与列记录合并成一行混合使用

    一般我们在数据库的表字段存储字典Id,如果有多个的话一般是用,或分隔符分隔(12,14),列表显示的时候是显示字典名,那如果要在数据库将字典Id转成用户看得懂的字典名,该怎么办呢? 我们这时候可以结合 ...

  2. (转)MYSQL 的 WITH ROLLUP

    使用 GROUP BY 的 WITH ROLLUP 字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息. 下面我们的例 ...

  3. 51nod 1202 不同子序列个数 [计数DP]

    1202 子序列个数 题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 子序列的定义:对于一个序列a=a[1],a[2],.. ...

  4. Codeforces 1037F. Maximum Reduction

    总感觉我这种做法会T,一直没写,看了其他人的题解也是这样,,,就果断写了,,可能数据不太深,或者玄学复杂度 题意即求xk-1长度的所有区间的最大值的和,对每一个i(数组下边),他对答案的贡献数量就是在 ...

  5. [CTF]Capture The Flag -- 夺旗赛

    CTF(Capture The Flag) 简单介绍 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式. `In co ...

  6. bean装配--注解

    1,Dao层 package com.songyan.zhujie; public interface UserDao { public void say(); } package com.songy ...

  7. win7 下注册dll文件失败

    1.win7 下注册dll文件失败,提示模块“xx.dll”已加载,但找不到入口点DllRegisterServer 原因:该dll文件非可注册组件,没有包含DllRegisterServer函数,可 ...

  8. A system tap script to detect UDP beacons

    https://gist.github.com/jbradley89/178bbf3944786c494bd78f3df16a5472

  9. ES的关键端口

    ElasticSearch的集群可自发现,只要配置相同的集群名称,默认为组播发现机制,默认情况下: http 端口:9200 需要打开给调用 数据传输端口:9300 用于集群之间交换数据 组播端口(U ...

  10. LeetCode 14: Longest Common Prefix

    Longest Common Prefix Write a function to find the longest common prefix string amongst an array of ...