Netty权威指南-Reactor模式
来源:互联网 发布:framework7项目源码 编辑:程序博客网 时间:2024/05/22 06:59
Java NIO非堵塞技术实际是采取反应器模式,或者说是观察者(observer)模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
同步和异步区别:有无通知(是否轮询)
堵塞和非堵塞区别:操作结果是否等待(是否马上有返回值),只是设计方式的不同
NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,接着我们可以处理这些数据。
反应器模式与观察者模式在某些方面极为相似:当一个主体发生改变时,所有依属体都得到通知。不过,观察者模式与单个事件源关联,而反应器模式则与多个事件源关联 。
下面我们以代码实现:
(1)首先我们服务器绑定端口并且接收客户端的连接
package com.reactor;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.util.Iterator;import java.util.Set;public class Reactor implements Runnable{ public final Selector selector; public final ServerSocketChannel serverSocketChannel; public Reactor(int port) throws IOException { selector = Selector.open(); serverSocketChannel = ServerSocketChannel.open(); InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(),port); serverSocketChannel.socket().bind(inetSocketAddress); serverSocketChannel.configureBlocking(false); //向selector注册该channel SelectionKey selectionKey = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); //利用selectionKey的attache功能绑定Acceptor 如果有事情,触发Acceptor selectionKey.attach(new Acceptor(this)); } public void run() { try { while(!Thread.interrupted()){ selector.select(); Set<SelectionKey> selectionKeys= selector.selectedKeys(); Iterator<SelectionKey> it= selectionKeys.iterator(); //Selector如果发现channel有OP_ACCEPT或READ事件发生,下列遍历就会进行。 while(it.hasNext()){ //来一个事件 第一次触发一个accepter线程 //以后触发SocketReadHandler SelectionKey selectionKey=it.next(); dispatch(selectionKey); selectionKeys.clear(); } } } catch (IOException e) { e.printStackTrace(); } } /** * 运行Acceptor或SocketReadHandler * @param key */ void dispatch(SelectionKey key) { Runnable r = (Runnable)(key.attachment()); if (r != null){ r.run(); } } }
(1)当有客户端连接到来的时候,就触发Acceptor
package com.reactor;import java.io.IOException;import java.nio.channels.SocketChannel;public class Acceptor implements Runnable{ private Reactor reactor; public Acceptor(Reactor reactor) { this.reactor = reactor; } public void run() { try { SocketChannel socketChannel=reactor.serverSocketChannel.accept(); if(socketChannel!=null)//调用Handler来处理channel new SocketReadHandler(reactor.selector, socketChannel); } catch (IOException e) { e.printStackTrace(); } }}
(3)如果有数据可以读取的时候就触发SocketReadHandler
package com.reactor;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;public class SocketReadHandler implements Runnable { private SocketChannel socketChannel; public SocketReadHandler(Selector selector, SocketChannel socketChannel) throws IOException{ this.socketChannel=socketChannel; socketChannel.configureBlocking(false); SelectionKey selectionKey=socketChannel.register(selector, 0); //将SelectionKey绑定为本Handler 下一步有事件触发时,将调用本类的run方法。 //参看dispatch(SelectionKey key) selectionKey.attach(this); //同时将SelectionKey标记为可读,以便读取。 selectionKey.interestOps(SelectionKey.OP_READ); selector.wakeup(); } /** * 处理读取数据 */ public void run() { ByteBuffer inputBuffer=ByteBuffer.allocate(1024); inputBuffer.clear(); try { socketChannel.read(inputBuffer); //激活线程池 处理这些request //requestHandle(new Request(socket,btt)); } catch (IOException e) { e.printStackTrace(); } }}
以上就是Reactor模式的基本使用,都是一些在工作中的总结,不正确的地方还希望指正。
0 0
- Netty权威指南-Reactor模式
- Netty与Reactor模式
- Netty与Reactor模式
- Netty与Reactor模式
- Netty与Reactor模式
- Netty教程-Reactor模式
- 《Netty权威指南》
- Netty权威指南
- Netty权威指南读书笔记
- netty 权威指南勘误
- Netty权威指南
- Netty权威指南pdf
- 《Netty权威指南》学习
- 《Netty权威指南》开始预售
- netty权威指南一书中代码
- 《netty权威指南》13文件传输
- Netty权威指南之文件传输
- Netty权威指南读书笔记-第一章
- eclipse启动tomcat无法访问
- 微信运营神器【运营小秘】封测邀请!
- Android中View绘制流程以及invalidate()等相关方法分析
- 从零开始搭建架构实施Android项目
- Sublime Text插件安装方法
- Netty权威指南-Reactor模式
- SQL相除去小数
- Web服务器的工作原理
- android java 调用 .so 动态库实例
- 将maven项目打war包并部署到Tomcat上
- 支付宝 接口解析
- linux中select()函数分析
- Java中的Arrays
- iOS多线程的基本使用