java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信
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通信相关推荐
- 【网络编程知识】使用Socket通信,做一个简单的多人聊天室
- 黑马程序员--Java学习日记之网络编程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.网络编程概述 1.计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及 ...
- Java核心类库篇8——网络编程
Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...
- Java学习——Day14:网络编程
7.1 网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. Java提供的网络类库,可以实现无痛的网络连接,联网的 ...
- Java进阶:基于TCP的网络实时聊天室(socket通信案例)
目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...
- 黑马程序员_java自学学习笔记(八)----网络编程
黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...
- java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计
[JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室
java网络编程,通过TCP,Socket实现多对一的局域网聊天室 可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端 这是服务器端的代码 View Code import j ...
- java 安卓客户端开发_《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端...
1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...
最新文章
- 解决Ubuntu Adobe Reader 菜单栏空白
- 门限的限意思是什么_门限是什么意思_门限英文翻译
- 高可用Eureka注册中心配置说明(双机部署)
- mysql A库a表 B库b表 将a表导入b表中
- SpringMVC系列(十四)Spring MVC的运行流程
- 阿里全盘调整组织架构意味着什么?| 畅言
- 手机Web 开发中图片img 如何等比例缩放
- Python入门--列表元素的判断及遍历,判断指定元素在列表中是否存在,列表元素的遍历,
- 讨论 innodb_log_block_size 变量
- 计算机二级C语言题库(44套真题+刷题软件)第一套
- SPSS在物流业中的应用
- 计算机应用基础自主学习,计算机应用基础教学中如何培养学生的自主学习能力...
- 单片机流水灯工作原理
- TeXmacs对中文的支持
- C#设置点击打开外部exe程序,并判断是否程序已开启,未开启的话打开,已经在运行了就前置
- 深度走心字节跳动内推
- 计算机主板功能是什么,电脑主板的作用是什么_电脑主板作用详细介绍 - 系统家园...
- 谷歌浏览器(chrome)允许跨域设置的方法
- 云南计算机网络技术排名,2017年云南大学排名
- QT——Qcharts绘制实时曲线
热门文章
- linux设置命令nmui,Linux网络配置及管理
- java文本框背景_用Java编写小程序(包含组合框下拉和文本框)变换背景颜色
- 字体选择_十分钟带你掌握精准选择字体的方法!
- python字符串操作作业_python 第二天作业
- python matlibplot绘制矩阵_matplotlib.pyplot.matshow 矩阵可视化实例
- 损失函数的意义和作用_损失函数的可视化:浅论模型的参数空间与正则
- linux退出windows域,删除Windows AD域控制器的三种方法
- 如果用户计算机已接入,01计算机基础知识题(50道)
- 谷歌Chrome浏览器发布10年成霸主
- 腾讯视频下载安装免费2020_腾讯视频app的哪里发贴