Netty入门--AIO

来源:互联网 发布:linux ip地址映射 编辑:程序博客网 时间:2024/06/08 17:06

AIO也就是NIO2.0,是Java1.7提供的新异步非阻塞I/O

NIO2.0的异步套接字通道是真正的异步非阻塞I/O,它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写。

下面是demo

package com.hueason.netty.n1.aio;/** * Created by Administrator on 2017/4/20. */public class TimeServer {    public static void main(String[] args) {        int port = 8080;        if (args != null && args.length > 0) {            port = Integer.valueOf(args[0]);        }        AsyncTimeServerHandler timeServer = new AsyncTimeServerHandler(port);        new Thread(timeServer, "AIO-AsyncTimeServerHandler-001").start();    }}

package com.hueason.netty.n1.aio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.channels.AsynchronousServerSocketChannel;import java.util.concurrent.CountDownLatch;/** * Created by Administrator on 2017/4/20. */public class AsyncTimeServerHandler implements Runnable {    private int port;    CountDownLatch latch;    AsynchronousServerSocketChannel asynchronousServerSocketChannel;    public AsyncTimeServerHandler(int port) {        this.port = port;        try {            asynchronousServerSocketChannel = AsynchronousServerSocketChannel.open();            asynchronousServerSocketChannel.bind(new InetSocketAddress(port));            System.out.println("The Time server is start in port :" + port);        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void run() {        latch = new CountDownLatch(1);        doAccept();        try {            latch.await();        } catch (InterruptedException e) {            e.printStackTrace();        }    }    private void doAccept() {        asynchronousServerSocketChannel.accept(this,new AcceptCompletionHandler());    }}

package com.hueason.netty.n1.aio;import java.nio.ByteBuffer;import java.nio.channels.AsynchronousSocketChannel;import java.nio.channels.CompletionHandler;/** * Created by Administrator on 2017/4/20. */public class AcceptCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, AsyncTimeServerHandler> {    @Override    public void completed(AsynchronousSocketChannel result, AsyncTimeServerHandler attachment) {        attachment.asynchronousServerSocketChannel.accept(attachment, this);        ByteBuffer buffer = ByteBuffer.allocate(1024);        result.read(buffer, buffer, new ReadCompletionHandler(result));    }    @Override    public void failed(Throwable exc, AsyncTimeServerHandler attachment) {        exc.printStackTrace();        attachment.latch.countDown();    }}

package com.hueason.netty.n1.aio;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.nio.ByteBuffer;import java.nio.channels.AsynchronousSocketChannel;import java.nio.channels.CompletionHandler;import java.util.Date;/** * Created by Administrator on 2017/4/20. */public class ReadCompletionHandler implements CompletionHandler<Integer, ByteBuffer> {    private AsynchronousSocketChannel channel;    public ReadCompletionHandler(AsynchronousSocketChannel channel) {        if (this.channel == null) {            this.channel = channel;        }    }    @Override    public void completed(Integer result, ByteBuffer attachment) {        attachment.flip();        byte[] body = new byte[attachment.remaining()];        attachment.get(body);        try {            String req = new String(body, "UTF-8");            System.out.println("The time server receive order " + req);            String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(req) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER";            doWrite(currentTime);        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }    }    private void doWrite(String currentTime) {        if (currentTime != null && currentTime.trim().length() > 0) {            byte[] bytes = currentTime.getBytes();            ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);            writeBuffer.put(bytes);            writeBuffer.flip();            channel.write(writeBuffer, writeBuffer, new CompletionHandler<Integer, ByteBuffer>() {                @Override                public void completed(Integer result, ByteBuffer buffer) {                    //如果没有发送完整,继续发送                    if (buffer.hasRemaining()) {                        channel.write(buffer, buffer, this);                    }                }                @Override                public void failed(Throwable exc, ByteBuffer attachment) {                    try {                        channel.close();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            });        }    }    @Override    public void failed(Throwable exc, ByteBuffer attachment) {        try {            this.channel.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

客户端

package com.hueason.netty.n1.aio;/** * Created by Administrator on 2017/4/20. */public class TimeClient {    public static void main(String[] args) {        int port = 8080;        if (args != null && args.length > 0) {            port = Integer.valueOf(args[0]);        }        new Thread(new AsyncTimeClientHandler("127.0.0.1",port),"AIO-AayncTimeClientHandler-001").start();    }}

package com.hueason.netty.n1.aio;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.AsynchronousSocketChannel;import java.nio.channels.CompletionHandler;import java.util.concurrent.CountDownLatch;/** * Created by Administrator on 2017/4/20. */public class AsyncTimeClientHandler implements CompletionHandler<Void, AsyncTimeClientHandler>, Runnable {    private AsynchronousSocketChannel client;    private String host;    private int port;    private CountDownLatch latch;    public AsyncTimeClientHandler(String host, int port) {        this.port = port;        this.host = host;        try {            client = AsynchronousSocketChannel.open();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void run() {        latch = new CountDownLatch(1);        client.connect(new InetSocketAddress(host, port), this, this);        try {            latch.await();        } catch (InterruptedException e) {            e.printStackTrace();        }        try {            client.close();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void completed(Void result, AsyncTimeClientHandler attachment) {        byte[] req = "QUERY TIME ORDER".getBytes();        ByteBuffer writeBuffer = ByteBuffer.allocate(req.length);        writeBuffer.put(req);        writeBuffer.flip();        client.write(writeBuffer, writeBuffer, new CompletionHandler<Integer, ByteBuffer>() {            @Override            public void completed(Integer result, ByteBuffer buffer) {                if (buffer.hasRemaining()) {                    client.write(buffer, buffer, this);                } else {                    ByteBuffer readBuffer = ByteBuffer.allocate(1024);                    client.read(readBuffer, readBuffer, new CompletionHandler<Integer, ByteBuffer>() {                        @Override                        public void completed(Integer result, ByteBuffer buffer) {                            buffer.flip();                            byte[] bytes = new byte[buffer.remaining()];                            buffer.get(bytes);                            String body;                            try {                                body = new String(bytes,"UTF-8");                                System.out.println("Now is "+body);                                latch.countDown();                            } catch (UnsupportedEncodingException e) {                                e.printStackTrace();                            }                        }                        @Override                        public void failed(Throwable exc, ByteBuffer attachment) {                            try {                                client.close();                            } catch (IOException e) {                                e.printStackTrace();                            }                        }                    });                }            }            @Override            public void failed(Throwable exc, ByteBuffer attachment) {                try {                    client.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        });    }    @Override    public void failed(Throwable exc, AsyncTimeClientHandler attachment) {        exc.printStackTrace();        try {            client.close();            latch.countDown();        } catch (IOException e) {            e.printStackTrace();        }    }}


只是简单的demo,用来描述AIO的基本用法。

NIO2.0中不需要像NIO那样创建一个独立的I/O线程来处理读写操作。

NIO2.0对于AsynchronousServerSocketChannel和AsynchronousSocketChannel,都是由JDK底层的线程池负责回调并驱动读写操作,相比于NIO编程更为简单。


0 0
原创粉丝点击