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完成,继续执行下面的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS+JS实现 ❤️简单的翻纸牌记忆游戏❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

java session 重定向_java – 在HttpSession之后重定向超时

我一直在看这个话题的很多帖子,但是无法得到一个适用于我的例子的解决方案.我正在使用Java EE 6与JSF 2.0(部署在JBoss AS 7.1上)在我的web.xml中,我有:1我希望用户在会话自动超时时被重定向到登录页面.我试过了方法1:使用过滤器我尝试了以下过滤器&…

HTML+CSS+JS实现 ❤️酷炫的canvas全屏背景动画特效❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

Java面典_【Java实用工具】——使用oshi获取主机信息

最近在筹划做一个监控系统。其中就要获取主机信息,其中遇到一些问题。在此做个记录,以便以后查阅。在该监控系统中,想要做到主机的CPU、内存、磁盘、网络、线程、JVM内存、JVM GC 等维度的监控,JVM方面的监控还好说,直…

HTML+CSS+JS实现 ❤️制作loading动画效果❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

java io编程_Java_IO编程

如果要进行文件内容的操作,必须依靠数据流完成,而数据流分为两种:字节流:InpuStream(字节输入流)、OutputStream(字节输出流)字符流:Reader(字符输入流)、Writer(字符输出流)字符比字节处理的多,但使用哪个…

HTML+CSS+JS实现 ❤️canvas 3D云动画效果❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

numpy python 兼容_Python 2和3之间的numpy数组的不兼容性

我试图加载MNIST数据集链接here在Python 3.2使用此程序:import pickleimport gzipimport numpywith gzip.open(mnist.pkl.gz, rb) as f:l list(pickle.load(f))print(l)不幸的是,它给我的错误:Traceback (most recent call last):File "…

HTML+CSS+JS实现 ❤️canvas 3D立体图片相册幻灯片❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

HTML+CSS+JS实现 ❤️3D立体魔方小游戏❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

css 解析器 java_Java 的 CSS 解析器 jStyleParser

软件介绍jStyleParser 是一个开源 Java 的 CSS 解析器,可以在 Java 程序中解析 CSS 样式文件。Mavennet.sf.cssboxjstyleparser3.2示例代码://get the element styleStyleMap map CSSFactory.assignDOM(doc, encoding, base, medium, true);NodeData st…

HTML+CSS+JS实现 ❤️slicebox酷炫3d图片轮播切换❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

HTML+CSS+JS实现 ❤️动态散花背景❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

java getdelay_java中DelayQueue的一个使用陷阱分析

最近工作中有接触到DelayQueue,网上搜索资料的时候发现一篇文章谈到DelayQueue的坑。点击打开链接文中已经总结了遇到坑的地方,还有解决方案。不过我第一眼看一下没弄明白为什么,所以翻了翻源码深究了一下,下面把这个坑的原因以及…

HTML+CSS+JS实现美女照片3D立方体旋转特效

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李阳勇 公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1…

JAVA回调函数的例子_javascript : 回调函数例子

数字时钟 digital_clock.htmlDigital Clock// Define a function to display the current timefunction displayTime() {var elt document.getElementById("clock"); // Find element with id"clock"var now new Date(); // Get current timeelt.innerHT…

HTML+CSS+JS实现 ❤️canvas酷炫表白爱心动画❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

HTML+CSS+JS实现 ❤️酷炫HUD科幻数据屏幕动画界面❤️

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

java 条件 等待_java – 如何唤醒等待相同条件的所有线程?

我有以下情况.几个线程正在等待相同的条件.当得到通知时,所有应该停止等待,更改标志并返回对象:public Object getObject(){lock.lock();try {while (check)){condition.await();}return returnObjectAndSetCheckToFalse();} finally {lock.unlock();}}但是这段代码…

基于Springboot+Mybatis实现个人理财系统

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…