一、概述
AIO叫异步阻塞
阻塞: 方法会一直等待不往下执行就是阻塞。
非阻塞:方法不会等待,直接向下执行就是非阻塞。
同步:有阻塞功能的方法需要接受返回值就是同步方法。
异步:有阻塞功能的方法不需要接受返回值有回调函数就是异步方法。
//BIO: 同步阻塞 ServerSocket
//NIO: 同步非阻塞 ServerSocketChannel
//AIO: 异步非阻塞 AsynchronousServerSocketChannel
二、AIO异步非阻塞-连接accept()
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class Test服务器 {
public static void main(String[] args) throws IOException {
//BIO: 同步阻塞 ServerSocket
//NIO: 同步非阻塞 ServerSocketChannel
//AIO: 异步非阻塞 AsynchronousServerSocketChannel
//创建服务器对象
AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open();
//绑定端口
assc.bind(new InetSocketAddress(8000));
//连接客户端
//A 是一个泛型可以使用任意引用类型,代表是备注信息
//CompletionHandler 是一个匿名内部类,代表回调函数
System.out.println(1);
//异步非阻塞!!!
assc.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
@Override
//在连接客户端成功的情况下会自动执行completed方法
public void completed(AsynchronousSocketChannel result, Object attachment) {
System.out.println("连接成功");
}
@Override
//在连接客户端失败的情况下会自动执行failed方法
public void failed(Throwable exc, Object attachment) {
}
});
System.out.println(2);
//模拟服务器是不结束的
while(true){
}
}
}
三、AIO异步非阻塞-读read()
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class Test服务器2 {
public static void main(String[] args) throws IOException {
//BIO: 同步阻塞 ServerSocket
//NIO: 同步非阻塞 ServerSocketChannel
//AIO: 异步非阻塞 AsynchronousServerSocketChannel
//创建服务器对象
AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open();
//绑定端口
assc.bind(new InetSocketAddress(8000));
//连接客户端
//A 是一个泛型可以使用任意引用类型,代表是备注信息
//CompletionHandler 是一个匿名内部类,代表回调函数
System.out.println(1);
//异步非阻塞!!!
assc.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
@Override
//在连接客户端成功的情况下会自动执行completed方法
public void completed(AsynchronousSocketChannel sc, Object attachment) {
//服务端在连接成功之后应该接受数据
//准备数组
ByteBuffer buffer = ByteBuffer.allocate(1024);
//读取数据
//异步非阻塞读取!!!!
//ByteBuffer 是一个数组,用于存放读取到的数据
//A 是一个泛型可以使用任意引用类型,代表是备注信息
//CompletionHandler 是一个匿名内部类,代表回调函数
System.out.println(3);
sc.read(buffer, null, new CompletionHandler<Integer, Object>() {
//在读取数据成功之后会自动执行
@Override
public void completed(Integer len, Object attachment) {
//打印读取到的信息
System.out.println(new String(buffer.array(),0,len));
System.out.println(5);
}
//在读取数据失败之后会自动执行
@Override
public void failed(Throwable exc, Object attachment) {
}
});
System.out.println(4);
}
@Override
//在连接客户端失败的情况下会自动执行failed方法
public void failed(Throwable exc, Object attachment) {
}
});
System.out.println(2);
//模拟服务器是不结束的
while(true){
}
}
}
四、AIO客户端演示【了解】
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class Test客户端2 {
public static void main(String[] args) throws IOException {
//BIO: Socket
//NIO: SocketChannel
//AIO: AsynchronousSocketChannel
AsynchronousSocketChannel asc = AsynchronousSocketChannel.open();
//连接服务器
//异步非阻塞的连接服务器的方法!!!
//SocketAddress 要连接的服务器的ip和端口
Integer a = 10;
//A 泛型 备注信息 没用 把匿名内部类外面的数据传到匿名内部类里面
//CompletionHandler 匿名内部类代表回调函数
asc.connect(new InetSocketAddress("192.168.171.32", 8000), a, new CompletionHandler<Void, Integer>() {
//连接上服务器之后自动执行
@Override
public void completed(Void result, Integer attachment) {
//发送数据
System.out.println("发送数据");
System.out.println(attachment);
}
@Override
//在连接失败时候会自动执行
public void failed(Throwable exc, Integer attachment) {
System.out.println("连接失败");
System.out.println(attachment);
attachment = 20;
}
});
//循环为了让程序别结束
while(true){
}
}
}
匿名内部类小问题回顾
public class Test {
public static void main(String[] args) {
int a = 10;
//匿名内部类如果使用外部类的局部变量,变量会自动变成final修饰
Inter i = new Inter() {
@Override
public void method() {
//a = 20;
//System.out.println(a);
}
};
}
}
BIO、NIO、AIO总结
BIO
同步阻塞
NIO
同步非阻塞 (非阻塞就是方法不会等待,可以直接向下执行。)
Buffer 缓冲区
Channel 通道
Selector 选择器
AIO
异步非阻塞 (异步就是没有返回值,在成功之后会自动调用回调函数)