[编织消息框架][网络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模型的应用场景都是什么 同步和异步.阻塞和非阻塞 同步和异步 广义上讲同步异步描述的是事件中发送方 ...
随机推荐
- OpenvSwitch Port Mirror in OpenStack Neutron
前言 最近使用搭建了一个基于VXLAN的OpenStack 环境,发现要去dump ovs interfaces的包其实还是蛮麻烦的, 经过多番努力,找到了如下的在openstack下网络环境的一些t ...
- ObjC中的AOP--面向切面编程
上篇博客我们类比着Java的Spring框架中的依赖注入的实现方式,也试着使用Objective-C来写了一下OC中的依赖注入的实现方式.当然,我们是使用的PList文件来加载的依赖注入时用到的依赖关 ...
- 开发使用Node.js的一个小技巧
Node.js作为可以在服务器端运行的一门语言,其处理长连接.多请求的优势受到各大编程爱好者的追捧. 但是在开发调试方面却极为不方便,因为每次改动代码后,都需要终止当前进程,重启服务器.supervi ...
- ubuntu16.10下安装erlang和RabbitMQ
Ubuntu系统下安装RabbitMQ(我选择的是Ubuntu Server 16.10) 1.首先必须要有Erlang环境支持 --安装之前要装一些必要的库(Erlang开发环境同样)(参考:duq ...
- Webstorm less watcher 配置
file > sttings > File watchers > 添加LESS watcher 配置如图:
- Jmeter-元件的作用域和执行顺序
Jmeter有8类可执行的元件,包括:逻辑控制器.配置元件.定时器.前置处理器.取样器.后置处理器.断言和监听器. 测试计划和线程组不属于元件. 1)取样器(Sampler):不与其他元件发生交互作用 ...
- javascript 类型的判断
在平常写js代码,类型判断必不可少,那么我们常见有哪几种?看到了标题,先不看你会想到那些方法 ,常用呢些呢?那么今天我自己总结一些判断类型的判断,如有错,万望告知! 1:typeof 常用这种方法不错 ...
- dellR720重启找不到启动引导项,手动选择也无用。
机器重启后显示 no boot device available.(如下图)检查bios中设置也是没问题的,因为装完系统后根本没动过什么.F11手动选择启动项也还是会跳到这里来. 这台机子做的Raid ...
- pygame加载中文名mp3文件出现error
好一阵子没有写东西了,最近几天在做一个基于Python pygame的音乐播放器,本来想做完了,再来发篇文章的,可越做越深,框架大致出来了,考虑周期比较长,也可能是我个人问题,做得比较慢,最近.下面来 ...
- h5 做app时和原生交互的小常识。
距离上次随笔或许有半年了吧,最近在用hybrid模式开发移动app,所以就简单的说说用h5技术开发app时候,做原生交互的几个小常识: 一.拨打电话或者发送短信: <a href="t ...