AIO 异步非阻塞读写

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);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值