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、SocketChannel的attach功能将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) {
}
}
相关推荐
Reactor翻译过来的意思是:反应堆,所以Reactor设计模式本质是基于事件驱动的。在Reactor设计模式中,存在如下几个角色。 Handle(事件)。Reactor整体是基于Handle进行驱动,这里的Handle叫做事件,可以类比为BIO...
EventMachine 是一个基于Reactor设计模式的、用于网络编程和并发编程的框架。Reactor模式描述了一种服务处理器,它接受事件并将其分发给已注册的事件处 理。这种模式的好处就是清晰的分离了时间分发和处理事件的应用...
(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。 (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非...
Scalable IO in Java -Doug Lea 描述java nio 和reactor 设计模式之间的关系
分析常见高性能网络设计模式,涵盖了reactor, proactor。
Scalable IO in Java -Doug Lea 学习NIO必看经典 描述java nio 和reactor 设计模式之间的关系
Java NIO学习文档。值得学习。reactor 设计模式。作者Doug Lea。java.util.concurrent包的作者
Proactor和Reactor模式_继续并发系统设计的扫盲[参照].pdf
(3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非...
reactor是一种设计模式, 是服务器的重要模型, 是一种事件驱动的反应堆模式, 高效的事件处理模型。 reactor 反应堆: 事件来了才执行,事件类型可能不尽相同,所以我们需要提前注册好不同的事件处理函数。事件到来就...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...小型Web服务器--Reactor模式(源码+项目说明).zip
是否具备高并发、高性能、分布式、事件驱动框架设计能力,是优秀C++中高级工程师的分水岭,我将通过本文带领大家纯手写一个Reactor服务器,让大家可以高效掌握三高框架设计思维,同时让你对C++网络编程、线程、智能...
铺垫 在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: ...上图是boost对Reactor模式的描绘,Twisted的设计就是基于这样的Reactor模式,Twisted程序就是在等待事件、处理事件的过程中不断循
基于Reactor模式,支持单线程、多线程Reactor,也支持UDP服务
可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...
可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...
可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请...3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!