[编织消息框架][网络IO模型]aio
asynchronous I/O (the POSIX aio_functions)—————异步IO模型最大的特点是 完成后发回通知。

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
即可以理解为,accept,connect,read,write方法都是异步的,完成后会主动调用回调函数。
在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:
- AsynchronousSocketChannel
- AsynchronousServerSocketChannel
- AsynchronousFileChannel
- AsynchronousDatagramChannel
其中的accept,connect,read,write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。
public class ClientAio implements Runnable {
private final static int count = 50000;
private final static AsynchronousSocketChannel[] clients = new AsynchronousSocketChannel[count];
private final static AtomicInteger ai = new AtomicInteger();
private String host;
private int port;
private AsynchronousSocketChannel client;
public ClientAio(String host, int port) throws IOException {
this.client = AsynchronousSocketChannel.open();
this.host = host;
this.port = port;
}
public static void main(String[] args) throws Exception {
String addr = args.length > 0 ? args[0] : "192.168.56.122";
while (ai.get() < count) {
new ClientAio(addr, 8989).run();
}
System.in.read();
}
public void run() {
client.connect(new InetSocketAddress(host, port), null, new CompletionHandler<Void, Object>() {
public void completed(Void result, Object attachment) {
int i = ai.getAndIncrement();
if (i < count) {
clients[i] = client;
}
final ByteBuffer byteBuffer = ByteBuffer.allocate(512);
client.read(byteBuffer, null, new CompletionHandler<Integer, Object>() {
public void completed(Integer result, Object attachment) {
//System.out.println("client read data: " + new String(byteBuffer.array()));
}
public void failed(Throwable exc, Object attachment) {
System.out.println("read faield");
}
});
}
public void failed(Throwable exc, Object attachment) {
System.out.println("client connect field...");
try {
if(client.isOpen()){
client.close();
}
} catch (IOException e) {
}
}
});
}
}
public class ServerAio implements Runnable {
private final static AtomicInteger ai = new AtomicInteger();
private int port = 8889;
private int threadSize = 10;
private AsynchronousChannelGroup asynchronousChannelGroup;
private AsynchronousServerSocketChannel serverChannel;
public ServerAio(int port, int threadSize) {
this.port = port;
this.threadSize = threadSize;
}
public static void main(String[] args) throws IOException {
new ServerAio(8989, Runtime.getRuntime().availableProcessors() * 10).run();
System.in.read();
}
public void run() {
try {
asynchronousChannelGroup = AsynchronousChannelGroup.withCachedThreadPool(Executors.newCachedThreadPool(), threadSize);
serverChannel = AsynchronousServerSocketChannel.open(asynchronousChannelGroup);
serverChannel.bind(new InetSocketAddress(port));
System.out.println("listening on port: " + port);
serverChannel.accept(this, new CompletionHandler<AsynchronousSocketChannel, ServerAio>() {
public void completed(AsynchronousSocketChannel result, ServerAio attachment) {
try {
System.out.println(ai.getAndIncrement());
ByteBuffer echoBuffer = ByteBuffer.allocateDirect(1024);
result.read(echoBuffer, null, new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) {
// System.out.println("received : " +
// Charset.defaultCharset().decode(echoBuffer));
}
@Override
public void failed(Throwable exc, Object attachment) {
}
});
result.write(ByteBuffer.wrap("ok".getBytes()));
} catch (Exception e) {
e.printStackTrace();
} finally {
attachment.serverChannel.accept(attachment, this);// 监听新的请求,递归调用。
}
}
public void failed(Throwable exc, ServerAio attachment) {
System.out.println("received failed");
exc.printStackTrace();
attachment.serverChannel.accept(attachment, this);// 监听新的请求,递归调用。
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
AIO与NIO对比,减少read阻塞等侍时间,速度非常之快,本人在window环境下测试瓶颈1.6W左右连接(后面会讲如何突破)
[编织消息框架][网络IO模型]aio的更多相关文章
- [编织消息框架][网络IO模型]BIO
既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...
- [编织消息框架][网络IO模型]NIO(select and poll)
上面测试论证系统内核在read data时会阻塞,如果我们在把第一个阶段解决掉那么性能就会提高 NIO 编程 JDK 1.4中的java.nio.*包中引入新的Java I/O库,其目的是提高速度.实 ...
- [编织消息框架][网络IO模型]Netty Reactor
严格来讲Netty Reactor是一种设计模式,一听模式两字就知道了吧,套路哈哈 Reactor中文译为“反应堆”. 看图netty处理流程 1.netty server 至少有两组reactor. ...
- 打开APP 04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋
打开APP 04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋
- Socket-IO 系列(一)Linux 网络 IO 模型
Socket-IO 系列(一)Linux 网络 IO 模型 一.基本概念 在正式开始讲 Linux IO 模型前,先介绍 5 个基本概念. 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器, ...
- 网络IO模型与Reactor模式
一.三种网络IO模型: 分类: BIO 同步的.阻塞式 IO NIO 同步的.非阻塞式 IO AIO 异步非阻塞式 IO 阻塞和同步的概念: 阻塞:若读写未完成,调用读写的线程一直等待 非阻塞:若读写 ...
- 通过实例理解Java网络IO模型
网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...
- 五种网络IO模型以及多路复用IO中select/epoll对比
下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络 ...
- Unix 网络IO模型介绍
带着问题阅读 1.什么是同步异步.阻塞非阻塞 2.有几种IO模型,不同模型之间有什么区别 3.不同IO模型的应用场景都是什么 同步和异步.阻塞和非阻塞 同步和异步 广义上讲同步异步描述的是事件中发送方 ...
随机推荐
- hdoj 1257 DP||贪心
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- MySQL优化三(InnoDB优化)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- java Pattern和Matcher详解
结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String ...
- javascript写贪吃蛇游戏(20行代码!)
<!doctype html> <html> <body> <canvas id="can" width="400" ...
- SQL_Join 小总结
原文出自 :http://www.nowamagic.net/librarys/veda/detail/936 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多in ...
- 容斥原理及SQL in关键字在EF中的应用
突然意识到文字的重要性,于是开始写了第一个篇博客,博客目的紧紧为记录,以便温故. 同时也希望抛砖能达到引玉的作用,欢迎各位来发表自己的感想与想法,以此达到相互学习促进! 背景: 在做百度地图电子围栏的 ...
- JS实现购物车特效
学习通过JavaScript实现类似于淘宝的购物车效果,包括商品的单选.全选.删除.修改数量.价格计算.数目计算.预览等功能. 1. 实现兼容低版本IE的getElementsByClassName( ...
- 我的java学习笔记
最近一直在自学C#和js,想着想把以前学的java学习笔记整理下发上来.
- Android Things教程:电气基础之直流电路理论
译者注:由于本人水平有限,译文中难免会出现概念模糊.晦涩难懂,如果实在没心思看下去,请发挥你的学习能动性,到原文中自行翻译,感谢!!!点这里,直达英文各种长句的世界. 好了,既然你选择继续往下看,那就 ...
- 在NAS设备上用NFS服务为RAC数据库和集群件存储oracle文件时的mount选项
今天在家折腾自己的小实验室,把自己NAS上的一个目录用NFS挂载到一套11g RAC的实验环境中. 当我在备份数据库到NAS上时,发现一个奇怪的问题,同样的目录下,默认backup 备份集的情况,备份 ...