Java7 NIO里面的新特性AIO出来也很久了,一直都没用过,今天没事写个小例子体验一下。感觉AIO要比同步NIO要简单点,写出正确的AIO比写同步NIO要容易一些,但是更不好理解,异步编程就是这样,不符合人类的直观感受。
服务端代码:
public class TestAioServer { private static AtomicInteger recvNum = new AtomicInteger(0); private static AtomicInteger sentNum = new AtomicInteger(0); private final byte[] resp; private static final int readLen = 1800; private ByteBuffer[] genBuf() { ByteBuffer[] buf = new ByteBuffer[2]; buf[0] = ByteBuffer.allocate(readLen); buf[1] = ByteBuffer.wrap(resp); return buf; } public TestAioServer(int port) throws IOException { StringBuilder sb = new StringBuilder(); for (int i=0; i<1000; i++) { sb.append("how are you? "); } resp = sb.toString().getBytes(); final AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(port)); serverChannel.accept(genBuf(), new CompletionHandler<AsynchronousSocketChannel, ByteBuffer[]>() { public void completed(AsynchronousSocketChannel ch, ByteBuffer[] att) { // 接受下一个连接 serverChannel.accept(genBuf(), this); // 处理当前连接 handle(ch, att); } public void failed(Throwable exc, ByteBuffer[] att) { System.out.println("建立连接失败"); serverChannel.accept(null, this); } }); System.out.println("Server is listening at : " + port); } public void handle(final AsynchronousSocketChannel ch, final ByteBuffer[] att) { final ByteBuffer dst = att[0]; ch.read(dst, att, new ReadCompletionHandler(dst, ch)); } private static class ReadCompletionHandler implements CompletionHandler<Integer, ByteBuffer[]> { ByteBuffer dst; AsynchronousSocketChannel ch; private CompletionHandler<Integer, ByteBuffer[]> writeCompletionHandler = getWriteCompletionHandler(); public ReadCompletionHandler(ByteBuffer dst, AsynchronousSocketChannel ch) { this.dst = dst; this.ch = ch; } @Override public void completed(Integer result, ByteBuffer[] attachment) { // System.out.println("result len = " + result); if (dst.position() == dst.capacity()) {//读完了 recvNum.incrementAndGet(); dst.clear();//为下次读做准备 // System.out.println("read : " + new String(dst.array())); ch.write(attachment[1], attachment, writeCompletionHandler); } } @Override public void failed(Throwable exc, ByteBuffer[] attachment) { System.out.println("read failed." ); exc.printStackTrace(); } public synchronized CompletionHandler<Integer, ByteBuffer[]> getWriteCompletionHandler() { if (writeCompletionHandler == null) { writeCompletionHandler = new CompletionHandler<Integer, ByteBuffer[]>() { @Override public void completed(Integer result, ByteBuffer[] attachment) { // System.out.println("written len : " + result); //要是没写完,继续 if (attachment[1].hasRemaining()) { ch.write(attachment[1], attachment, this); } else {//已经写完 sentNum.incrementAndGet(); attachment[1].rewind();//为下次写做准备 //写完了才继续读,生产中不要这么做,此处只是为了简单 ch.read(dst, attachment, ReadCompletionHandler.this); } } @Override public void failed(Throwable exc, ByteBuffer[] attachment) { System.out.println("write failed." ); exc.printStackTrace(); } }; } return writeCompletionHandler; } } public static void main(String[] args) throws IOException, InterruptedException { int port = 1234; new TestAioServer(port); Thread.sleep(15000); recvNum.set(0); sentNum.set(0); Thread.sleep(30000); System.out.println(recvNum.get()+":"+sentNum.get()); Thread.sleep(30*60*1000); } }
客户端的代码是阻塞式IO:
public class TestSocketClient { private static final byte[] req; static { StringBuilder sb = new StringBuilder(); for (int i=0; i<100; i++) { sb.append("This is a request."); } req = sb.toString().getBytes(); } private static final byte[] resp = new byte[13000]; public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException { int port = 1234; Socket socket = new Socket(); socket.connect(new InetSocketAddress(InetAddress.getByName("localhost"), port)); final InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); new Thread () { public void run() { long startTime = System.currentTimeMillis(); int loopTimes = 1; for (;; loopTimes++) { try { int len = is.read(resp); //不一定会读满 for (; len<resp.length;) { len += is.read(resp, len-1, resp.length-len); } } catch (IOException e) { e.printStackTrace(); break; } // System.out.println(new String(b)); System.out.println("-" + loopTimes); if (loopTimes == 30000) { System.out.println("time cost : " + (System.currentTimeMillis() - startTime)); } } } }.start(); for (int i=0; i<30000; i++) { os.write(req); // os.flush(); System.out.println("written"); Thread.sleep(1); } } }
相关推荐
基于java的开发源码-smart-socket 开源的Java AIO框架.zip 基于java的开发源码-smart-socket 开源的Java AIO框架.zip 基于java的开发源码-smart-socket 开源的Java AIO框架.zip 基于java的开发源码-smart-socket ...
JAVA 7 AIO 学习笔记,很详细的讲解
不到800行代码实现极简、易用、高性能的java AIO通信框架,也许是物联网开发的最佳选择
NULL 博文链接:https://pzh9527.iteye.com/blog/2361692
涉及到java io, nio, aio相关知识点,学习过程中的一些总结,持续更新中,xmind 格式
基于java AIO实现的RPC调用框架
基于java aio 的RPC 远程调用框架
smart-socket 开源的Java AIO框架.zip
基于 java aio 实现,开源、简单、易用、低延迟、高性能百万级 java mqtt client 组件和 java mqtt broker 服务
smart-socket是一款国产开源的 Java AIO 通信框架,支持 TCP、UDP、SSL/TLS 。 高性能、高并发、低延迟、低能耗 代码量极少,可读性强。核心代码不到 1500 行,工程结构、包层次清晰。 学习门槛低,二次开发只需...
对java io总结时编写的测试代码,包括BIO,NIO,AIO的实现,Java io操作是编程人员经常使用到的,以前只是使用没有对这三种IO做系统的了解,本文将对这三种IO作详细的介绍并附有测试完整代码
NIO,AIO编程
基于 java aio 实现的低延迟、高性能百万级 mqtt client 组件和 mqtt broker 服务。支持 MQTT v3.1、v3.1.1 以及 v5.0 协议。 支持 websocket mqtt 子协议(支持 mqtt.js)。 支持 http rest api, 支持 MQTT client...
Smart-Socket是一款国产开源的 Java AIO 通信框架,支持 TCP、UDP、SSL/TLS 。 作为一款极简、易用、高性能的通信框架,现已广泛运用于物联网、证券、电力、电商等诸多领域。 二、Smart-Socket的优势有哪些? 1.高...
二、java NIO,AIO编程视频教程 1、java NIO,AIO编程_01.flv 2、java NIO,AIO编程_02.flv 3、java NIO,AIO编程_03.flv 4、java NIO,AIO编程_04.flv 5、java NIO,AIO编程_05.flv 三、Java语言基础教程-Java NIO...
基于java的BIO、NIO、AIO通讯模型代码实现
关于java最新技术1.7的新特性相关的内容,写得还不错,有例子有说明...
java的bio nio aio 几种io的详细解释
基于java aio 的RPC 远程调用框架 组件介绍 Serializer 序列化和反序列的工具类,项目的实现为基于Gson的序列化工具 IOHandler 从Channel中读取数据并交由Serializer处理的类,本身是异步读取数据 在读取数据时 提供...