AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO

核心类有AsynchronousSocketChannel 、AsynchronousServerSocketChannel、AsynchronousChannelGroup

前两个个类是javaAIO为TCP通信提供的异步Channel。看名字就知道应该是干什么的了。

创建AsynchronousServerSocketChannel的代码如下:

AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(PORT));

其中open()有一个重载方法,可以使用指定的AsynchronousChannelGroup来创建AsynchronousServerSocketChannel。

AsynchronousChannelGroup是异步Channel的分组管理器,它可以实现资源共享。创建AsynchronousChannelGroup时,需要传入一个ExecutorService,也就是绑定一个线程池,该线程池负责两个任务:处理IO事件和触发CompletionHandler回调接口。代码如下:

AsynchronousServerSocketChannel serverSocketChannel = null;try{

ExecutorService executorService= Executors.newFixedThreadPool(80);

AsynchronousChannelGroup channelGroup=AsynchronousChannelGroup.withThreadPool(executorService);

serverSocketChannel= AsynchronousServerSocketChannel.open(channelGroup).bind(new InetSocketAddress(9000));

}catch(IOException ioe){

ioe.printStackTrace();

}

AsynchronousServerSocketChannel创建成功后,类似于ServerSocket,也是调用accept()方法来接受来自客户端的连接,由于异步IO实际的IO操作是交给操作系统来做的,用户进程只负责通知操作系统进行IO和接受操作系统IO完成的通知。所以异步的ServerChannel调用accept()方法后,当前线程不会阻塞,程序也不知道accept()方法什么时候能够接收到客户端请求并且操作系统完成网络IO,为解决这个问题,AIO为accept方法提供两个版本:

Future accept() :开始接收客户端请求,如果当前线程需要进行网络IO(即获得AsynchronousSocketChannel),则应该调用该方法返回的Future对象的get()方法,但是get方法会阻塞该线程,所以这种方式是阻塞式的异步IO。

void accept(A attachment ,CompletionHandler handler):开始接受来自客户端请求,连接成功或失败都会触发CompletionHandler对象的相应方法。其中AsynchronousSocketChannel就代表该CompletionHandler处理器在处理连接成功时的result是AsynchronousSocketChannel的实例。

而CompletionHandler接口中定义了两个方法,

completed(V result , A attachment):当IO完成时触发该方法,该方法的第一个参数代表IO操作返回的对象,第二个参数代表发起IO操作时传入的附加参数。

faild(Throwable exc, A attachment):当IO失败时触发该方法,第一个参数代表IO操作失败引发的异常或错误。

使用第一种accept方法需要如下代码

while (true){

Future future =serverSocketChannel.accept();

AsynchronousSocketChannel socketChannel= null;try{

socketChannel=future.get();

socketChannel.write(ByteBuffer.wrap("ssss".getBytes("UTF-8")));

}catch(Exception e){

e.printStackTrace();

}

}

通常使用第二种accept,实现自己的CompletionHandler实现类。

而AsynchronousSocketChannel的的用法与Socket类似,由三个方法,但是不同的是每个方法又分为Future版本与CompletionHandler版本。

connect():用于连接到指定端口,指定IP地址的服务器

read()、write():完成读写。

注意!使用异步Channel时,accept()、connect()、read()、write()等方法都不会阻塞,也就是说如果使用返回Future的这些方法,程序并不能直到什么时候成功IO,必须要使用get方法,等get方法的阻塞结束后才能确保IO完成,继续执行下面的操作。

java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信相关推荐

  1. 【网络编程知识】使用Socket通信,做一个简单的多人聊天室

  2. 黑马程序员--Java学习日记之网络编程

     ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.网络编程概述 1.计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及 ...

  3. Java核心类库篇8——网络编程

    Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...

  4. Java学习——Day14:网络编程

    7.1 网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. Java提供的网络类库,可以实现无痛的网络连接,联网的 ...

  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  6. 黑马程序员_java自学学习笔记(八)----网络编程

    黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...

  7. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

  8. java网络编程,通过TCP,Socket实现多对一的局域网聊天室

    java网络编程,通过TCP,Socket实现多对一的局域网聊天室 可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端 这是服务器端的代码 View Code import j ...

  9. java 安卓客户端开发_《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端...

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

最新文章

  1. 解决Ubuntu Adobe Reader 菜单栏空白
  2. 门限的限意思是什么_门限是什么意思_门限英文翻译
  3. 高可用Eureka注册中心配置说明(双机部署)
  4. mysql A库a表 B库b表 将a表导入b表中
  5. SpringMVC系列(十四)Spring MVC的运行流程
  6. 阿里全盘调整组织架构意味着什么?| 畅言
  7. 手机Web 开发中图片img 如何等比例缩放
  8. Python入门--列表元素的判断及遍历,判断指定元素在列表中是否存在,列表元素的遍历,
  9. 讨论 innodb_log_block_size 变量
  10. 计算机二级C语言题库(44套真题+刷题软件)第一套
  11. SPSS在物流业中的应用
  12. 计算机应用基础自主学习,计算机应用基础教学中如何培养学生的自主学习能力...
  13. 单片机流水灯工作原理
  14. TeXmacs对中文的支持
  15. C#设置点击打开外部exe程序,并判断是否程序已开启,未开启的话打开,已经在运行了就前置
  16. 深度走心字节跳动内推
  17. 计算机主板功能是什么,电脑主板的作用是什么_电脑主板作用详细介绍 - 系统家园...
  18. 谷歌浏览器(chrome)允许跨域设置的方法
  19. 云南计算机网络技术排名,2017年云南大学排名
  20. QT——Qcharts绘制实时曲线

热门文章

  1. linux设置命令nmui,Linux网络配置及管理
  2. java文本框背景_用Java编写小程序(包含组合框下拉和文本框)变换背景颜色
  3. 字体选择_十分钟带你掌握精准选择字体的方法!
  4. python字符串操作作业_python 第二天作业
  5. python matlibplot绘制矩阵_matplotlib.pyplot.matshow 矩阵可视化实例
  6. 损失函数的意义和作用_损失函数的可视化:浅论模型的参数空间与正则
  7. linux退出windows域,删除Windows AD域控制器的三种方法
  8. 如果用户计算机已接入,01计算机基础知识题(50道)
  9. 谷歌Chrome浏览器发布10年成霸主
  10. 腾讯视频下载安装免费2020_腾讯视频app的哪里发贴