AIO 异步非阻塞读写
- 此篇不做说明只放代码用于自己保存查看
服务端代码
public class Server {
public static void main(String[] args) throws IOException {
//开启AsynchronousSocketChannel异步服务端通道
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
//2.绑定本地某个端口
AsynchronousServerSocketChannel bind = serverSocketChannel.bind(new InetSocketAddress(8888));
3.接收异步客户端,采用异步非阻塞方式
//accpet(附件(nulll),接口(AIO中的事件处理类:CompletionHandler));
bind.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
@Override
public void completed(AsynchronousSocketChannel ch, Object attachment) {
bind.accept(null,this);
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
System.out.println("[服务器]read开始");
//从客户端中读取数据
//异步的read(字节缓冲区,超时时间,时间单位,附件(null),回调接口)
ch.read(byteBuffer, 10, TimeUnit.SECONDS, null, new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) {
if (result==-1){
System.out.println("客户端没有传输数据就close了");
}
System.out.println("服务器读取数据:"+new String(byteBuffer.array(),0,result));
try {
ch.close();
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void failed(Throwable exc, Object attachment) {
exc.printStackTrace();
System.out.println(attachment);
System.out.println("[服务器]异常");
}
});
System.out.println("[服务器]read结束.....");
}
@Override
public void failed(Throwable exc, Object attachment) {
}
});
System.out.println("服务器开始循环");
while (true){
}
}
}
客户端代码
public class Client1 {
public static void main(String[] args) throws InterruptedException, IOException {
//开启AsynchronousSocketChannel异步客户端通道
AsynchronousSocketChannel socketChannel = AsynchronousSocketChannel.open();
//connect(服务器的IP和端口号,附件(null),接口)绑定接口||
// AIO中的事件处理类:CompletionHandler:
//用于消除异步I / O操作结果的处理程序。
//在此包中定义的异步通道允许指定完成处理程序以消耗异步操作的结果。 当I / O操作成功完成时,将调用completed方法。
// 如果I / O操作失败,则调用failed方法。 这些方法的实现应该及时完成,以避免将调用线程调度到其他完成处理程序。
//completed(V result, A attachment) 操作完成后调用。
//failed(Throwable exc, A attachment) 当操作失败时调用。
socketChannel.connect(new InetSocketAddress("localhost", 8888), null, new CompletionHandler<Void, Object>() {//匿名内部类
@Override
public void completed(Void result, Object attachment) {
//write(ByteBuffer src, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer,? super A> handler)
// 从给定的缓冲区向该通道写入一个字节序列。
socketChannel.write(
ByteBuffer.wrap("你好服务器".getBytes()), null, new CompletionHandler<Integer, Object>() {
@Override
//result - I / O操作的结果。
//attachment - 启动时附加到I / O操作的对象。
public void completed(Integer result, Object attachment) {
System.out.println("输出完毕");
}
@Override
//exc - 表示I / O操作失败的原因的例外
//attachment - 启动时附加到I / O操作的对象。
public void failed(Throwable exc, Object attachment) {
System.out.println("输出失败");
}
});
try {
socketChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void failed(Throwable exc, Object attachment) {
System.out.println("[客户端]异常!");
}
});
Thread.sleep(1000);
}
}