`

Reactor设计模式

阅读更多

NIO用到的Reactor设计模式,下面的说明比较清楚,留作记录。

 

Reactor设计模式和观察者模式非常相似,但是它比观察者模式复杂,Reactor设计模式使用一个Selector对象相当于观察模者式里面观察者,每个
SocketServerChannal 实例和SocketChannal实例都相当于被观察者,当然它们需要在Selector对象里面注册,它们注册之后每个Channal实例都会分配一个 SelectionKey对象,SelectionKey对象可以attach(附带)一个对象,当Selector里面注册channal有事件发生 时,Selector就会产生一个遍历,这时候可以在遍历时候用attachment()方法把每个SelectionKey里面attach对象o 提出来,你可以在这个时候运行在o对象所属类O里面所定义方法,在这个方法里面可以使用socket.read()方法进行读取网络数据,将数据读出 后,可以将这些数据处理线程做成一个线程池,这样,数据读出后,立即扔到线程池中,这样加速处理速度。
注意在每次遍历提出SelectionKey,对注册channal读或写进行处理完毕之后,需要对channal进行重新注册,重新attach()对象。


使用nio提供Reactor设计模式,我们可以设计一个高性能nio服务器:
1、启动一个实现Runnable接口Reactor,在Reactor构造方法里面使用Selector.open()方法实例化一个Selector。
2、打开一个ServerSocketChannal,代码:
ServerSocketChannel serverSocket = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);
serverSocket.socket().bind(address);
serverSocket.configureBlocking(false);
3、将ServerSocketChannal在selector里进行注册,代码:
SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);
4、给sk附带上一个事件处理对象,代码:
sk.attach(new Acceptor());
5、在Reactor类run方法里面对selector不停循环扫描,如果发现注册channal里面有OP_ACCEPT或READ事件发生,有话就触发一个selector附带上事件处理对象线程,处理完毕之后须将所有注册事件清空,代码如下:
public void run() {
try {
while (!Thread.interrupted())
{
selector.select();
Set selected = selector.selectedKeys();
Iterator it = selected.iterator();
while (it.hasNext())        
dispatch((SelectionKey)(it.next()));        
}
            selected.clear();
}catch (IOException ex) {       
}
}

void dispatch(SelectionKey k) {
Runnable r = (Runnable)(k.attachment());
if (r != null){
r.run();
}
}

6、我们可以在ServerSocketChannal注册sk里附带下面事件处理类对象(注意这是一个内部类):
class Acceptor implements Runnable {
public void run() {
try {
SocketChannel c = serverSocket.accept();
if (c != null)
//调用Handler来处理channel
new SocketReadHandler(selector, c);
}
catch(IOException ex) {     
}
}
}

7、SocketChannelattach功能将Hanlder和可能会发生事件channel链接在一起,当发生事件时,可以立即触发相应 链接Handler。我们在事件处理类里面需要做事情是在selector里面注册socketChannal,并附带上本handler,下一步有 事件触发时会调用本类run方法:
public class SocketReadHandler implements Runnable { 
final SocketChannel socket;    
final SelectionKey sk;
static final int READING = 0, SENDING = 1;  

  public SocketReadHandler(Selector sel, SocketChannel c)
throws IOException {
socket = c;
socket.configureBlocking(false);
sk = socket.register(sel, READING);
sk.attach(this);

    //将SelectionKey注册为可读,以便读取。
sk.interestOps(SelectionKey.OP_READ);
sel.wakeup();
}

  public void run() {
try{    
readRequest() ;
}catch(Exception ex){    
}
}

private void readRequest() throws Exception {
ByteBuffer input = ByteBuffer.allocate(1024);  
try{
int bytesRead = socket.read(input);
......

    //使用线程池处理request
requestHandle(new Request(socket,btt));
.....

  }catch(Exception e) {
}

}

分享到:
评论

相关推荐

    C++从0实现百万并发Reactor服务器完结13章

    Reactor翻译过来的意思是:反应堆,所以Reactor设计模式本质是基于事件驱动的。在Reactor设计模式中,存在如下几个角色。 Handle(事件)。Reactor整体是基于Handle进行驱动,这里的Handle叫做事件,可以类比为BIO...

    网络编程和并发编程的框架EventMachine.zip

    EventMachine 是一个基于Reactor设计模式的、用于网络编程和并发编程的框架。Reactor模式描述了一种服务处理器,它接受事件并将其分发给已注册的事件处 理。这种模式的好处就是清晰的分离了时间分发和处理事件的应用...

    高性能IO模型浅析

    (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。 (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非...

    Scalable IO in Java -Doug Lea

    Scalable IO in Java -Doug Lea 描述java nio 和reactor 设计模式之间的关系

    网络服务设计模式

    分析常见高性能网络设计模式,涵盖了reactor, proactor。

    Doug Lea Scalable IO in Java

    Scalable IO in Java -Doug Lea 学习NIO必看经典 描述java nio 和reactor 设计模式之间的关系

    Scalable IO in Java by Doug Lea

    Java NIO学习文档。值得学习。reactor 设计模式。作者Doug Lea。java.util.concurrent包的作者

    Proactor和Reactor模式_继续并发系统设计的扫盲[参照].pdf

    Proactor和Reactor模式_继续并发系统设计的扫盲[参照].pdf

    Socket高性能IO模型浅析

    (3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非...

    C++从0实现百万并发Reactor服务器完结13章下载

    reactor是一种设计模式, 是服务器的重要模型, 是一种事件驱动的反应堆模式, 高效的事件处理模型。 reactor 反应堆: 事件来了才执行,事件类型可能不尽相同,所以我们需要提前注册好不同的事件处理函数。事件到来就...

    小型Web服务器--Reactor模式(源码+项目说明).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...小型Web服务器--Reactor模式(源码+项目说明).zip

    完结13章C++从0实现百万并发Reactor服务器

    是否具备高并发、高性能、分布式、事件驱动框架设计能力,是优秀C++中高级工程师的分水岭,我将通过本文带领大家纯手写一个Reactor服务器,让大家可以高效掌握三高框架设计思维,同时让你对C++网络编程、线程、智能...

    详解Python的Twisted框架中reactor事件管理器的用法

    铺垫 在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: ...上图是boost对Reactor模式的描绘,Twisted的设计就是基于这样的Reactor模式,Twisted程序就是在等待事件、处理事件的过程中不断循

    Easy-Reactor是一个Linux C++高性能TCP服务框架.zip

    基于Reactor模式,支持单线程、多线程Reactor,也支持UDP服务

    Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程.zip

    可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...

    基于Reactor 模式的多线程现代化C++11网络库.zip

    可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...

    基于C++11多线程主从Reactor模式的Web高性能服务器.zip

    可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...

    小型Web服务器--Reactor模式(完整源码+说明).zip

    【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请...3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!

Global site tag (gtag.js) - Google Analytics