美文网首页Java
Java AIO基础API

Java AIO基础API

作者: ThingLin | 来源:发表于2017-08-10 21:11 被阅读47次

JDK1.7 AIO是异步非阻塞的,代码上AIO简化了NIO很多繁琐的实现。

对象 作用
ExecutorService 线程池
AsynchronousChannelGroup 线程组
AsynchronousServerSocketChannel AIO的server对象
CompletionHandler 异步IO的处理模板

AIOServer.java

package cn.thinglin.aio;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AIOServer {
    //线程池
    private ExecutorService executorService;
    //线程组
    private AsynchronousChannelGroup threadGroup;
    //服务器通道
    public AsynchronousServerSocketChannel assc;
    
    public AIOServer(int port){
        try {
            //创建一个缓存池
            executorService = Executors.newCachedThreadPool();
            //创建线程组
            threadGroup = AsynchronousChannelGroup.withCachedThreadPool(executorService, 1);
            //创建服务器通道
            assc = AsynchronousServerSocketChannel.open(threadGroup);
            //进行绑定
            assc.bind(new InetSocketAddress(port));
            
            System.out.println("server start , port : " + port);
            //accept不能使主线程阻塞
            //CompletionHandler流处理对象
            assc.accept(this, new CompletionHandler<AsynchronousSocketChannel, AIOServer>(){

                @Override
                public void completed(AsynchronousSocketChannel result, AIOServer attachment) {
                    attachment.assc.accept(attachment, this);//当有下一个客户端接入的时候 直接调用Server的accept方法,这样反复执行下去,保证多个客户端都可以阻塞
                    read(result);
                }

                @Override
                public void failed(Throwable exc, AIOServer attachment) {
                    //连接失败
                    exc.printStackTrace();
                }});
            //阻塞主线程不让服务停止
            Thread.sleep(Integer.MAX_VALUE);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void read(final AsynchronousSocketChannel asc) {
        //读取数据
        ByteBuffer buf = ByteBuffer.allocate(1024);
        asc.read(buf, buf, new CompletionHandler<Integer, ByteBuffer>() {
            @Override
            public void completed(Integer resultSize, ByteBuffer attachment) {
                //进行读取之后,重置标识位
                attachment.flip();
                //获得读取的字节数
                System.out.println("Server -> " + "收到客户端的数据长度为:" + resultSize);
                //获取读取的数据
                String resultData = new String(attachment.array()).trim();
                System.out.println("Server -> " + "收到客户端的数据信息为:" + resultData);
                String response = "服务器响应, 收到了客户端发来的数据: " + resultData;
                write(asc, response);
            }
            @Override
            public void failed(Throwable exc, ByteBuffer attachment) {
                exc.printStackTrace();
            }
        });
    }
    
    private void write(AsynchronousSocketChannel asc, String response) {
        try {
            ByteBuffer buf = ByteBuffer.allocate(1024);
            buf.put(response.getBytes());
            buf.flip();
            asc.write(buf).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        AIOServer server = new AIOServer(8765);
    }
}


AIOClient.java

package cn.thinglin.aio;

import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;

public class AIOClient implements Runnable{
    private AsynchronousSocketChannel asc ;
    
    public AIOClient() throws Exception {
        asc = AsynchronousSocketChannel.open();
    }
    
    public void connect(){
        asc.connect(new InetSocketAddress("127.0.0.1", 8765));
    }
    
    public void write(String request){
        try {
            asc.write(ByteBuffer.wrap(request.getBytes())).get();
            read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void read() {
        ByteBuffer buf = ByteBuffer.allocate(1024);
        try {
            asc.read(buf).get();
            buf.flip();
            byte[] respByte = new byte[buf.remaining()];
            buf.get(respByte);
            System.out.println(new String(respByte,"utf-8").trim());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void run() {
        while(true){
            
        }
    }
    
    public static void main(String[] args) throws Exception {
        AIOClient c1 = new AIOClient();
        c1.connect();
        
        AIOClient c2 = new AIOClient();
        c2.connect();
        
        AIOClient c3 = new AIOClient();
        c3.connect();
        
        new Thread(c1, "c1").start();
        new Thread(c2, "c2").start();
        new Thread(c3, "c3").start();
        
        Thread.sleep(1000);
        
        c1.write("c1 aaa");
        c2.write("c2 bbbb");
        c3.write("c3 ccccc");
    }
}

image.png

相关文章

  • Java AIO基础API

    JDK1.7 AIO是异步非阻塞的,代码上AIO简化了NIO很多繁琐的实现。 AIOServer.java AIO...

  • Java AIO基础

    Java AIO(异步IO)特性是在Java7引入的。 [TOC] 同步异步、阻塞非阻塞的理解 同步和异步 同步和...

  • Java基础-AIO

    AIO More New IO,或称 NIO.2,随 JDK 1.7 发布,包括了引入异步 IO 接口和 Path...

  • Java AIO-Proactor模式

    Java7之前只支持BIO、NIO,但在Java 7 时添加了Java AIO,Java AIO基于epoll模式...

  • BIO,NIO,AIO 总结

    BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 ...

  • BIO,NIO,AIO 总结

    BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 ...

  • Java NIO

    一、基础概念 Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java ...

  • java基础:String — 字符串常量池与intern(二)

    其他更多java基础文章:java基础学习(目录) 学习资料:String类API中文深入解析String#int...

  • Javaweb自学(一)学习路线规划

    一、Java学习路线 第一阶段:Java基础,包括java语法,面向对象特征,常见API,集合框架; (基础) 第...

  • Java后端知识体系

    基础重点(必须扎实) Java语言 语言基础 《Java核心技术》基础语法面向对象常用API异常处理集合IO多线程...

网友评论

    本文标题:Java AIO基础API

    本文链接:https://www.haomeiwen.com/subject/pbhkrxtx.html