深入理解Java AIO(一)—— Java AIO的简单使用

深入理解AIO系列分为三个部分

第一部分也就是本节的Java AIO的简单使用

第二部分是AIO源码解析(只解析关键部分)(待更新)

Future和CompletionHandler

Java 异步 IO 提供了两种使用方式,分别是返回 Future 实例和使用回调函数。

Future 实例

future.isDone();

判断操作是否已经完成,包括了正常完成、异常抛出、取消

future.cancel(true);

取消操作,方式是中断。参数 true 说的是,即使这个任务正在执行,也会进行中断。

future.isCancelled();

是否被取消,只有在任务正常结束之前被取消,这个方法才会返回 true

future.get();

这是我们的老朋友,获取执行结果,阻塞。

future.get(10, TimeUnit.SECONDS);

如果上面的 get() 方法的阻塞你不满意,那就设置个超时时间。

Futrue这个东西和在线程池里用的应该差不多,不过我暂时没看明白怎么用,也没查到什么资料,之后看一下线程池再过来更新这块。

CompletionHandler 回调函数

java.nio.channels.CompletionHandler 接口定义:

public interface CompletionHandler{//attachment是用来传递参数进去的

voidcompleted(V result, A attachment);voidfailed(Throwable exc, A attachment);

}

用法:

AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open().bind(null);//accept 方法的第一个参数可以传递 attachment

listener.accept(attachment, new CompletionHandler() {

@Overridepublic voidcompleted(

AsynchronousSocketChannel client, Object attachment) {//

}

@Overridepublic voidfailed(Throwable exc, Object attachment) {//

}

});

简单实例

老样子只贴服务端部分的:

Server

public classServer {public static void main(String[] args) throwsIOException {//实例化,并监听端口

AsynchronousServerSocketChannel server =AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));//自己定义一个 Attachment 类,用于传递一些信息

Attachment att = newAttachment();

att.setServer(server);

server.accept(att,new CompletionHandler() {

@Overridepublic voidcompleted(AsynchronousSocketChannel client, Attachment att) {try{

SocketAddress clientAddr=client.getRemoteAddress();

System.out.println("收到新的连接:" +clientAddr);//收到新的连接后,server 应该重新调用 accept 方法等待新的连接进来

att.getServer().accept(att, this);

Attachment newAtt= newAttachment();

newAtt.setServer(server);

newAtt.setClient(client);

newAtt.setReadMode(true);

newAtt.setBuffer(ByteBuffer.allocate(2048));//这里也可以继续使用匿名实现类,不过代码不好看,所以这里专门定义一个类

client.read(newAtt.getBuffer(), newAtt, newChannelHandler());

}catch(IOException ex) {

ex.printStackTrace();

}

}

@Overridepublic voidfailed(Throwable t, Attachment att) {

System.out.println("accept failed");

}

});//为了防止 main 线程退出

try{

Thread.currentThread().join();

}catch(InterruptedException e) {

}

}

}

ChannelHandler

public class ChannelHandler implements CompletionHandler{

@Overridepublic voidcompleted(Integer result, Attachment att) {if(att.isReadMode()) {//读取来自客户端的数据

ByteBuffer buffer =att.getBuffer();

buffer.flip();byte bytes[] = new byte[buffer.limit()];

buffer.get(bytes);

String msg= newString(buffer.array()).toString().trim();

System.out.println("收到来自客户端的数据: " +msg);//响应客户端请求,返回数据

buffer.clear();

buffer.put("Response from server!".getBytes(Charset.forName("UTF-8")));

att.setReadMode(false);

buffer.flip();//写数据到客户端也是异步

att.getClient().write(buffer, att, this);

}else{//到这里,说明往客户端写数据也结束了,有以下两种选择://1. 继续等待客户端发送新的数据过来//att.setReadMode(true);//att.getBuffer().clear();//att.getClient().read(att.getBuffer(), att, this);//2. 既然服务端已经返回数据给客户端,断开这次的连接

try{

att.getClient().close();

}catch(IOException e) {

}

}

}

@Overridepublic voidfailed(Throwable t, Attachment att) {

System.out.println("连接断开");

}

}

Attachment

public classAttachment {privateAsynchronousServerSocketChannel server;privateAsynchronousSocketChannel client;private booleanisReadMode;privateByteBuffer buffer;//getter & setter

}

因为网上资料较少,只找到了HongJie大佬的作为参考,所以写不出多少东西,over。

I’m sorry for being so useless too

java aio_深入理解Java AIO(一)—— Java AIO的简单使用相关推荐

  1. 【Java基础】从Java语言层面理解BIO,NIO,AIO(二)

    文章目录 零.从网络层面理解BIO,NIO,AIO 一.相关概念 1.什么是socket? 2.IP地址(IP Address) 3.端口(Port) 4.协议(Protocol) 4.1.协议简介 ...

  2. 读Java核心技术36讲有感——谈谈对Java的理解,谈谈Exception和Error

    读过杨晓峰老师的36讲之后,想总结下自己的感想,写下来也有助于记忆,方便以后面试查阅和复习.题目所提到的话题本来是两讲,但是由于感想篇幅较短,所以合成一篇来写. 一.谈谈对Java平台的理解: 1.J ...

  3. 深入java核心_Java核心(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...

  4. Java核心(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...

  5. Java提高班(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...

  6. java aio_【Java】Java AIO使用

    欢迎关注公众号: nullobject . 文章首发在个人博客 https://www.nullobject.cn,公众号nullobject同步更新. 这篇文章主要介绍Java AIO网络编程. 1 ...

  7. 也谈BIO | NIO | AIO (Java版--转)

    http://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BI ...

  8. Java IO框架之BIO、NIO、AIO

    我是傲骄鹿先生,沉淀.学习.分享.成长. 如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑.见解以及面试中遇到的奇葩问法 目录 一.概述 二.BIO ...

  9. Java IO编程全解(五)——AIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7794151.html 前面讲到:Java IO编程全解(四)--NIO编程 NIO2.0引入了新的异步通道的 ...

最新文章

  1. iPhone开发技巧之工具篇(4)--- 使用afconvert转换WAV文件
  2. 7怎么导入中文文献_如何下载并引用参考文献?
  3. 【项目管理】ITTO-成本管理
  4. exit() 与_exit的区别
  5. Servlet底层原理、Servlet实现方式、Servlet生命周期
  6. java开发第一天上班_从第一天开始,如何成为一名优秀的团队合作伙伴,成为初级开发人员
  7. SyntaxError: Non-UTF-8 code starting with '\xba' in file 错误的解决方法!!
  8. php小白书,php小白的自学第一天
  9. python并发编程3-进程
  10. redis-数据操作-键命令
  11. 台达服务器型号,台达网络服务器机柜 42u 600宽 1200 2000mm SR1160标准机柜
  12. asp.net dev xtraReporting(一)静态页面
  13. 被称为最好最易理解的MATLAB入门教程
  14. 从 “C语言之父” 那里学到的一些好东西!分享给你~
  15. android 取消指纹识别,Android 指纹识别
  16. 计算机等级考试四级--数据库原理
  17. 熵增与热力学第二定律
  18. taskmgr跟着敲
  19. MySQL中修改数据的命令: INSERT、UPDATA、DELETE。
  20. 软件自动化测试框架STAF

热门文章

  1. iOS开发 - 第04篇 - 网络 - 02 - JSON解析 请求 黑酷例子 HTTP通信
  2. 批量水印大师 v2.6 [正式版] 绿色破解版
  3. 在金山卫士开源中如何开源自己的项目
  4. 浅谈连锁中医馆等健康产品的运营策略
  5. matlab labview 集成,利用COM技术的LabVIEW与MATLAB的无缝集成.pdf
  6. 慢谈漫威--来龙去脉
  7. 解决 VScode 中 MPE 插件无法渲染各种图的问题
  8. Wpf 系统异常提示框
  9. 移动APP毕业设计开发指南
  10. 创建使用Oracle同义词