JAVA AIO编程

article/2025/9/13 19:39:46

Asynchronous IO: 异步非阻塞的编程方式
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:
AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O 请求都是由OS
先完成了再通知服务器应用去启动线程进行处理。
AIO 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调
用OS 参与并发操作,编程比较复杂,JDK7 开始支持。

在这里插入图片描述

package aio;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.Scanner;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;public class AIOClient {private AsynchronousSocketChannel channel;public AIOClient(String host, int port){init(host, port);}private void init(String host, int port){try {// 开启通道channel = AsynchronousSocketChannel.open();// 发起请求,建立连接。channel.connect(new InetSocketAddress(host, port));} catch (IOException e) {e.printStackTrace();}}public void write(String line){try {ByteBuffer buffer = ByteBuffer.allocate(1024);buffer.put(line.getBytes("UTF-8"));buffer.flip();channel.write(buffer);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}public void read(){ByteBuffer buffer = ByteBuffer.allocate(1024);try {// read方法是异步方法,OS实现的。get方法是一个阻塞方法,会等待OS处理结束后再返回。channel.read(buffer).get();// channel.read(dst, attachment, handler);buffer.flip();System.out.println("from server : " + new String(buffer.array(), "UTF-8"));} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}public void doDestory(){if(null != channel){try {channel.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {AIOClient client = new AIOClient("localhost", 9999);try{System.out.print("enter message send to server > ");Scanner s = new Scanner(System.in);String line = s.nextLine();client.write(line);client.read();}finally{client.doDestory();}}}
package aio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class AIOServer {// 线程池, 提高服务端效率。private ExecutorService service;// 线程组// private AsynchronousChannelGroup group;// 服务端通道, 针对服务器端定义的通道。private AsynchronousServerSocketChannel serverChannel;public AIOServer(int port){init(9999);}private void init(int port){try {System.out.println("server starting at port : " + port + " ...");// 定长线程池service = Executors.newFixedThreadPool(4);/* 使用线程组group = AsynchronousChannelGroup.withThreadPool(service);serverChannel = AsynchronousServerSocketChannel.open(group);*/// 开启服务端通道, 通过静态方法创建的。serverChannel = AsynchronousServerSocketChannel.open();// 绑定监听端口, 服务器启动成功,但是未监听请求。serverChannel.bind(new InetSocketAddress(port));System.out.println("server started.");// 开始监听// accept(T attachment, CompletionHandler<AsynchronousSocketChannel, ? super T>)// AIO开发中,监听是一个类似递归的监听操作。每次监听到客户端请求后,都需要处理逻辑开启下一次的监听。// 下一次的监听,需要服务器的资源继续支持。serverChannel.accept(this, new AIOServerHandler());try {TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new AIOServer(9999);}public ExecutorService getService() {return service;}public void setService(ExecutorService service) {this.service = service;}public AsynchronousServerSocketChannel getServerChannel() {return serverChannel;}public void setServerChannel(AsynchronousServerSocketChannel serverChannel) {this.serverChannel = serverChannel;}}
package aio;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.Scanner;
import java.util.concurrent.ExecutionException;public class AIOServerHandler implements CompletionHandler<AsynchronousSocketChannel, AIOServer> {/*** 业务处理逻辑, 当请求到来后,监听成功,应该做什么。* 一定要实现的逻辑: 为下一次客户端请求开启监听。accept方法调用。* result参数 : 就是和客户端直接建立关联的通道。*  无论BIO、NIO、AIO中,一旦连接建立,两端是平等的。*  result中有通道中的所有相关数据。如:OS操作系统准备好的读取数据缓存,或等待返回数据的缓存。*/@Overridepublic void completed(AsynchronousSocketChannel result, AIOServer attachment) {// 处理下一次的客户端请求。类似递归逻辑attachment.getServerChannel().accept(attachment, this);doRead(result);}/*** 异常处理逻辑, 当服务端代码出现异常的时候,做什么事情。*/@Overridepublic void failed(Throwable exc, AIOServer attachment) {exc.printStackTrace();}/*** 真实项目中,服务器返回的结果应该是根据客户端的请求数据计算得到的。不是等待控制台输入的。* @param result*/private void doWrite(AsynchronousSocketChannel result){try {ByteBuffer buffer = ByteBuffer.allocate(1024);System.out.print("enter message send to client > ");Scanner s = new Scanner(System.in);String line = s.nextLine();buffer.put(line.getBytes("UTF-8"));// 重点:必须复位,必须复位,必须复位buffer.flip();// write方法是一个异步操作。具体实现由OS实现。 可以增加get方法,实现阻塞,等待OS的写操作结束。result.write(buffer);// result.write(buffer).get(); // 调用get代表服务端线程阻塞,等待写操作完成} catch (UnsupportedEncodingException e) {e.printStackTrace();}/* catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}*/}private void doRead(final AsynchronousSocketChannel channel){ByteBuffer buffer = ByteBuffer.allocate(1024);/** 异步读操作, read(Buffer destination, A attachment,*                    CompletionHandler<Integer, ? super A> handler)* destination - 目的地, 是处理客户端传递数据的中转缓存。 可以不使用。* attachment - 处理客户端传递数据的对象。 通常使用Buffer处理。* handler - 处理逻辑*/channel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {/*** 业务逻辑,读取客户端传输数据* attachment - 在completed方法执行的时候,OS已经将客户端请求的数据写入到Buffer中了。*  但是未复位(flip)。 使用前一定要复位。*/@Overridepublic void completed(Integer result, ByteBuffer attachment) {try {System.out.println(attachment.capacity());// 复位attachment.flip();System.out.println("from client : " + new String(attachment.array(), "UTF-8"));doWrite(channel);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {exc.printStackTrace();}});}}

http://chatgpt.dhexx.cn/article/C5fJGoD0.shtml

相关文章

java aio_Java AIO详解

JDK1.7升级了NIO类库&#xff0c;升级后的NIO类库被称为NIO 2.0。 Java正式提供了异步文件I/O操作&#xff0c;同时提供了与UNIX网络编程事件驱动I/O对应的AIO。 AIO编程 NIO 2.0引入了新的异步通道的概念&#xff0c;并提供了异步文件通道和异步套接字通道的实现。 异步通道获…

Java I/O 模型之 AIO

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;Java 教程&#xff1a;从入门到精通 大家好&#xff0c;我是水滴~~ 文章目录 服务端API创建服务端套接字的异步通道接…

如何用AIO技术提高程序性能

写在前面 这是一篇关于 AIO 的文章。本篇文章详细对比了几个常见的I/O模型&#xff0c;并且介绍了AIO相关的一些API。 我把英文原文翻译过来整理成这篇文章。目的一个是自己学习&#xff0c;一个是方便不习惯看英文资料的同学进行学习。 英文原文地址&#xff1a; https://…

08【AIO编程】

八、AIO编程 8.1 AIO编程简介 8.1.1 AIO编程概述 AIO也叫异步非阻塞&#xff0c;JDK1.7之后的新特性&#xff0c;AIO引入异步通道的概念&#xff0c;采用了 Proactor 模式&#xff0c;简化了程序编写&#xff0c;有效的请求才启动线程&#xff0c;它的特点是先由操作系统完成…

linux aio进程简介,Linux AIO机制

Linux的I/O机制经历了一下几个阶段的演进&#xff1a; 1. 同步阻塞I/O: 用户进程进行I/O操作&#xff0c;一直阻塞到I/O操作完成为止。 2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK&#xff0c;I/O操作可以立即返回&#xff0c;但是并不保证I/O操作成功…

关于aio

AIO 是异步非阻塞 同步意味着&#xff0c;在进行读写操作时&#xff0c;线程需要等待结果&#xff0c;还是相当于闲置 异步意味着&#xff0c;在进行读写操作时&#xff0c;线程不必等待结果&#xff0c;而是将来由操作系统来通过回调方式由另外的线程来获得结果 AIO的read方…

linux AIO

AIO 是 Linux 下的异步读写模型&#xff0c;它是 2.6 内核提供的一个标准增强特性。对于文件的读写&#xff0c;即使以 O_NONBLOCK 方式来打开一个文件&#xff0c;也会处于 “阻塞” 状态&#xff0c;因为文件时时刻刻处于可读状态&#xff0c;而从磁盘到内存所等待的时间是惊…

AIO模型

目录 AIO模型介绍 AsynchronousServerSocketChannel&#xff1a;AIO中网络通信服务端的socket 1、future方法 2、callback回调方式 AIO 的回调方式编程 BIO、NIO、AIO的比较 1、释义 BIO&#xff1a;同步阻塞IO模型 NIO&#xff1a;同步非阻塞IO模型 AIO&#xff1a;…

java中IO模型-AIO模型

AIO模型介绍 AIO&#xff08;Asynchronous I/O&#xff09; 异步非阻塞模型&#xff0c; 在javajdk.17版本开始支持AIO&#xff0c;AIO模型需要操作系统的支持。 AIO最大的特性是异步能力&#xff0c;对socket和I/O起作用。 异步IO模型类似的 与NIO模型不同&#xff0c;读写操…

架构解密从分布式到微服务:深入理解网络,AIO

AIO AIO是I/O模型里一个很高的层次&#xff0c;体现了大道至简的软件美学理念。与NIO相比&#xff0c;AIO的框架和使用方法相对简单很多。 AIO包括两大部分:AIO Files解决了文件的异步处理问题&#xff0c;AIO Sockets解决了Socket的异步处理问题。AIO的核心概念为应用发起非…

BIO,NIO,AIO区别

BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候&#xff0c;不需要关心操作系统层面的知识&#xff0c;也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,…

Apache CXF - 快速指南

Apache CXF - 简介 在当今的环境中&#xff0c;您可以使用多个选项来创建 Web 服务应用程序。您可以使用多种标准和广泛接受的协议中的一种或多种进行通信。例如SOAP、XML/HTTP、RESTful HTTP和CORBA&#xff08;通用对象请求代理架构&#xff0c;在过去非常流行&#xff0c;但…

java cxf 安全_CXF client在并发下的线程安全问题

这个是发生在上周周末的真实案例&#xff0c;因为cxf client 端线程安全导致的错误&#xff0c;总结出来希望其他使用cxf的兄弟注意。 首先描述一下背景&#xff0c;简单的说就是使用cxf作为web service的客户端&#xff0c;运行在weblogic上&#xff0c;连接外部的服务器。为了…

linux cxf服务端,Apache CXF 框架应用实战

一、概述 Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务&#xff0c;可以部署在Tomcat和基于Spring的轻量级容器中&#xff0c;也可以部署在更高级的服务器上&#xff0c;例如Jboss、WebSphere或WebLogic。 CXF提供了以下功能…

使用CXF调用WSDL

简介 时隔多年&#xff0c;再次遇到需要调用WebService的业务&#xff0c;对方给予的wsdl说明文档还是内网的链接&#xff0c;并且设有基础访问权限&#xff0c;即在浏览器打开wsdl链接时需要输入【用户名密码】登录后方可查看wsdl文档&#xff0c;这需要设置代理&#xff08;我…

spring5.x cxf3.4.x 服务端和客户端 非maven版本

文章目录 一、资料准备1. 官网链接2. 解压3. 依赖梳理 二、spring集成cxf2.1.创建spring项目2.2. 创建接口2.3. impl2.4. spring-cxf.xml2.5. 客户端2.6. 开源项目 一、资料准备 1. 官网链接 http://cxf.apache.org/download.html 下载apache-cxf-3.4.5.zip 2. 解压 3. 依赖…

CXF实现WebService

一、CXF简介 Apache CXF Celtix XFire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华&#xff0c;提供了对 JAX-WS 全面的支持&#xff0c;并且提供了多种 Binding …

SpringBoot2 整合 CXF 服务端和客户端

文章目录 一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果 二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码. 一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></proper…

CXF客户端乱码

CXF客户端乱码 解决办法一&#xff0c;设置服务端代码&#xff1a; 在使用CXF与其他系统对接时&#xff0c;发现对方系统响应的汉字乱码&#xff0c;使用soapui调用测试就没有问题&#xff0c;但是程序里面调用就乱码&#xff0c;很奇怪&#xff0c;乱码如下&#xff1a; 由…

SpringBoot集成CXF

CXF入门篇https://blog.csdn.net/tongxin_tongmeng/article/details/126482362Server端项目结构 Server端pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"…