java中的AIO
AIO(异步非阻塞)AIO采用了Proactor模式,AIO与NIO的不同之处在于当AIO在进行读写操作时,不用先等通知,可直接调用相应的read/write方法,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序,而NIO的通知是发生在动作之前的,是在可读、写的时候,Selector发现了这些事件后调用Handler处理.
在AIO socket编程中,服务端通道是AsynchronousServerSocketChannel,这个类提供了一个open()静态工厂,一个bind()方法用于绑定服务端IP地址(还有端口号),另外还提供了accept()用于接收用户连接请求。在客户端使用的通道是AsynchronousSocketChannel,这个通道处理提供open静态工厂方法外,还提供了read和write方法。
在AIO编程中,发出一个事件(accept read write等)之后要指定事件处理类(回调函数),AIO中的事件处理类是CompletionHandler<V,A>,这个接口定义了如下两个方法,分别在异步操作成功和失败时被回调。
void completed(V result, A attachment);
void failed(Throwable exc, A attachment);
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.nio.ByteBuffer;
- import java.nio.channels.AsynchronousServerSocketChannel;
- import java.nio.channels.AsynchronousSocketChannel;
- import java.nio.channels.CompletionHandler;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.Future;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.TimeoutException;
- public class AIOEchoServer {
- public final static int PORT = 8001;
- public final static String IP = "127.0.0.1";
- private AsynchronousServerSocketChannel server = null;
- public AIOEchoServer(){
- try {
- //同样是利用工厂方法产生一个通道,异步通道 AsynchronousServerSocketChannel
- server = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(IP,PORT));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //使用这个通道(server)来进行客户端的接收和处理
- public void start(){
- System.out.println("Server listen on "+PORT);
- //注册事件和事件完成后的处理器,这个CompletionHandler就是事件完成后的处理器
- server.accept(null,new CompletionHandler<AsynchronousSocketChannel,Object>(){
- final ByteBuffer buffer = ByteBuffer.allocate(1024);
- @Override
- public void completed(AsynchronousSocketChannel result,Object attachment) {
- System.out.println(Thread.currentThread().getName());
- Future<Integer> writeResult = null;
- try{
- buffer.clear();
- result.read(buffer).get(100,TimeUnit.SECONDS);
- System.out.println("In server: "+ new String(buffer.array()));
- //将数据写回客户端
- buffer.flip();
- writeResult = result.write(buffer);
- }catch(InterruptedException | ExecutionException | TimeoutException e){
- e.printStackTrace();
- }finally{
- server.accept(null,this);
- try {
- writeResult.get();
- result.close();
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void failed(Throwable exc, Object attachment) {
- System.out.println("failed:"+exc);
- }
- });
- }
- public static void main(String[] args) {
- new AIOEchoServer().start();
- while(true){
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
客户端:
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.nio.ByteBuffer;
- import java.nio.channels.AsynchronousSocketChannel;
- import java.nio.channels.CompletionHandler;
- public class AIOClient {
- public static void main(String[] args) throws IOException {
- final AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
- InetSocketAddress serverAddress = new InetSocketAddress("127.0.0.1",8001);
- CompletionHandler<Void, ? super Object> handler = new CompletionHandler<Void,Object>(){
- @Override
- public void completed(Void result, Object attachment) {
- client.write(ByteBuffer.wrap("Hello".getBytes()),null,
- new CompletionHandler<Integer,Object>(){
- @Override
- public void completed(Integer result,
- Object attachment) {
- final ByteBuffer buffer = ByteBuffer.allocate(1024);
- client.read(buffer,buffer,new CompletionHandler<Integer,ByteBuffer>(){
- @Override
- public void completed(Integer result,
- ByteBuffer attachment) {
- buffer.flip();
- System.out.println(new String(buffer.array()));
- try {
- client.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void failed(Throwable exc,
- ByteBuffer attachment) {
- }
- });
- }
- @Override
- public void failed(Throwable exc, Object attachment) {
- }
- });
- }
- @Override
- public void failed(Throwable exc, Object attachment) {
- }
- };
- client.connect(serverAddress, null, handler);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
java中的AIO的更多相关文章
- 再谈一次关于Java中的 AIO(异步IO) 与 NIO(非阻塞IO)
今天用ab进行压力测试时,无意发现的: Requests per second: xxx [#/sec] (mean) ab -n 5000 -c 1000 http://www:8080/up ...
- Java中的IO、NIO、File、BIO、AIO详解
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...
- 深入理解Java AIO(三)—— Linux中的AIO实现
我们调用的Java AIO底层也是要调用OS的AIO实现,而OS主要也就Windows和Linux这两大类,当然还有Solaris和mac这些小众的. 在 Windows 操作系统中,提供了一个叫做 ...
- 京东数科二面:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...
- 京东数科面试真题:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
本文节选自<Java面试进阶指北 打造个人的技术竞争力> 面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平. IO 模型这块确实挺难理解的,需要太多计 ...
- Java 中的纤程库 – Quasar
来源:鸟窝, colobu.com/2016/07/14/Java-Fiber-Quasar/ 如有好文章投稿,请点击 → 这里了解详情 最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服 ...
- 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?
笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...
- Java NIO学习系列六:Java中的IO模型
前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...
- Java NIO之Java中的IO分类
前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...
随机推荐
- Jmeter + Ant 构建接口自动化
1.首先安装ANT,解压,建议放根目录. 对应安装包已上传 2.环境变量配置新建 ANT_HOMEANT_HOME:解压的路径path环境配置新增Path:%ANT_HOME%\binclasspat ...
- html收尾
<form>input 元素</form> <fieldset ></fieldset > <legend ></legend> ...
- ArcObjects中IMapAlgebraOp的使用体会
本文提供使用IMapAlgebraOp接口实现大部分栅格计算的简单方法. 1.首先,ArcObjects提供了很多关于栅格计算的方法,有条件运算.逻辑运算及数学表达式,如下: ...
- 剑指offer22:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
1 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 2 思路和方法 使用一个队列存放节点.先将根节点加入到队列中,然后循环遍历队列中的元素,遍历过程中,访问该节点的左右子节点,再将左 ...
- nodeJs+vue安装教程详解 相信
相信很多朋友都在装node服务和安装vue的时候会遇到一些问题,下面为大家详细介绍node服务的安装以及vue的安装: 1.nodeJs官网下载版本(根据自己电脑的配置进行相应下载即可):默认安装路径 ...
- jQueryUI的widget的Hello World
为了看懂jQuery-File-Upload里面的代码,所以学习到这里 //main.js //实践自定义jquery widget,风格1 (function($){ //$.widget('命名空 ...
- java中的权限修饰符&关键字
1.类的权限修饰符default(不写权限修饰符),public 说明:类的权限修饰符只有default(不写权限修饰符)和public. package world default Y N pu ...
- vue中组件之间的通信
一.vue中组件通信的种类 父组件向子组件的通信 子组件向父组件的通信 隔代组件之间的通信 兄弟 组件 之间的通信 二.实现通信的方式 props vue自定义的事件 消息订阅与发布 vuex sl ...
- STM8 定时器
中断映射表 对应stm8_interrupt.c #pragma vector=1 __interrupt void TRAP_IRQHandler(void) { } #pragma vector= ...
- C# 中写得很不错的一段代码摘出来
private void LikeMyworkEvent(EditedImg img, bool islike) //点赞自己的作品 { if (ApplicationModel.userInfo ! ...