`
shihuan830619
  • 浏览: 584094 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Netty5 AIO

    博客分类:
  • J2SE
阅读更多
工程结构图:


TimeServer.java文件内容如下:
package com.shihuan.netty.server;

public class TimeServer {

	public static void main(String[] args) {
		int port = 8080;
		if (args != null && args.length > 0) {
		    try {
		    	port = Integer.valueOf(args[0]);
		    } catch (NumberFormatException e) {
		    	// 采用默认值
		    }
		}
		AsyncTimeServerHandler timeServer = new AsyncTimeServerHandler(port);
		new Thread(timeServer, "AIO-AsyncTimeServerHandler-001").start();
	}

}


AsyncTimeServerHandler.java文件内容如下:
package com.shihuan.netty.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.util.concurrent.CountDownLatch;

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();
		}
    }
    
    public void doAccept() {
    	asynchronousServerSocketChannel.accept(this, new AcceptCompletionHandler());
	}
	
	@Override
	public void run() {
		latch = new CountDownLatch(1);
		doAccept();
		try {
		    latch.await();
		} catch (InterruptedException e) {
		    e.printStackTrace();
		}
	}

}


AcceptCompletionHandler.java文件内容如下:
package com.shihuan.netty.server;

import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

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();
	}

}


ReadCompletionHandler.java文件内容如下:
package com.shihuan.netty.server;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class ReadCompletionHandler implements CompletionHandler<Integer, ByteBuffer> {

	private AsynchronousSocketChannel channel;
	
	public ReadCompletionHandler(AsynchronousSocketChannel channel) {
		if (this.channel == null) {
			this.channel = channel;
		}    
	}
	
	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) {
						// ingnore on close
					}
				}
			});
		}
	}
	
	@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 java.util.Date(System.currentTimeMillis()).toString() : "BAD ORDER";
		    doWrite(currentTime);
		} catch (UnsupportedEncodingException e) {
		    e.printStackTrace();
		}
	}

	@Override
	public void failed(Throwable exc, ByteBuffer attachment) {
		try {
		    this.channel.close();
		} catch (IOException e) {
		    e.printStackTrace();
		}
	}

}


TimeClient.java文件内容如下:
package com.shihuan.netty.client;

public class TimeClient {

	public static void main(String[] args) {
		int port = 8080;
		if (args != null && args.length > 0) {
		    try {
		    	port = Integer.valueOf(args[0]);
		    } catch (NumberFormatException e) {
		    	// 采用默认值
		    }

		}
		new Thread(new AsyncTimeClientHandler("127.0.0.1", port), "AIO-AsyncTimeClientHandler-001").start();
	}

}


AsyncTimeClientHandler.java文件内容如下:
package com.shihuan.netty.client;

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;

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.host = host;
		this.port = port;
		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 e1) {
		    e1.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();
								latch.countDown();
						    } catch (IOException e) {
						    	// ingnore on close
						    }
						}
				    });
				}
		    }
	
		    @Override
		    public void failed(Throwable exc, ByteBuffer attachment) {
				try {
				    client.close();
				    latch.countDown();
				} catch (IOException e) {
				    // ingnore on close
				}
		    }
		});
	}

	@Override
	public void failed(Throwable exc, AsyncTimeClientHandler attachment) {
		exc.printStackTrace();
		try {
		    client.close();
		    latch.countDown();
		} catch (IOException e) {
		    e.printStackTrace();
		}
	}

}


运行截图:



testnetty5.rar是源代码
  • 大小: 34.6 KB
  • 大小: 21.3 KB
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    一个完全基于java 实现的,长得有点像netty的aio网络框架

    《构建Java AIO网络框架:探索 Getty 框架与 Netty 的相似之处》 在IT行业中,网络框架是构建高性能、高并发服务器应用的重要工具。Netty作为一款广泛使用的异步事件驱动的网络应用程序框架,深受开发者喜爱。然而...

    BIO、NIO、AIO、Netty 、TCP全网最全解析!Netty中提供了哪些线程模型?

    本文将深入探讨BIO( Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架中的线程模型,并与TCP网络协议相结合,为您提供全网最全面的解析。 首先,让我们从基础开始,了解这些I/O...

    BIO,NIO,AIO,Netty面试题.pdf

    ### BIO、NIO、AIO、Netty 面试题解析 #### 1. Java IO 基础概述 Java中的I/O操作是通过流(Stream)来实现的,所有的数据都通过流的方式被串行化处理。串行化的含义在于数据必须按顺序输入输出。Java中的IO操作...

    Netty nio protocolbuf视频课程

    包含了Netty,NIO AIO,Mina知识的详解以及netty结合spring protocolbuf的源码

    网络通信 netty_io

    【网络通信:Netty、BIO、NIO与AIO详解】 在计算机科学中,网络通信是实现系统间数据交换的关键技术。Java平台提供了多种I/O模型来支持网络通信,包括传统的阻塞I/O(BIO)、非阻塞I/O(NIO)以及异步I/O(AIO)。...

    aio.zip_netty_netty-socket

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 的核心概念、特性以及它在网络编程中的应用,特别是针对多Socket服务器集成...

    BIO,NIO,AIO,Netty面试题

    在Java开发领域,BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架是网络编程中的重要概念,对于Java开发工程师来说,理解并掌握这些技术是必不可少的。以下是对这些知识点的...

    Netty应用说明笔记

    1. ForkJoinPool带来的复杂性:Netty 5引入了ForkJoinPool,但其对性能的提升并不显著,反而增加了代码的复杂性。 2. 分支同步难度:多个分支的代码同步需要大量工作,增加了维护成本。 3. 作者认为时机不成熟:在...

    Netty最新jar包

    Netty最新jar包,里面有源码,需要的朋友可以下载。。。

    netty+thrift高并发高性能

    1. **异步非阻塞通信**:Netty基于Java NIO技术实现,通过使用异步非阻塞IO(AIO)和多路复用技术,能够在一个线程中处理多个客户端连接,极大地提高了系统的并发处理能力。 - **NIO多路复用模型**:如图2-3所示...

    netty原理的讲解

    进一步发展,AIO(Asynchronous IO,也称为NIO.2)引入了异步非阻塞IO,允许应用程序注册感兴趣的IO事件,并在事件发生时通过回调函数进行处理,提高了系统效率。 Netty正是基于NIO设计的,但Netty对NIO进行了许多...

    2024年Java常见的-BIO,NIO,AIO,Netty面试题

    5. **AIO(Asynchronous I/O)**: - **定义**:AIO是一种异步非阻塞的I/O模型,它进一步优化了NIO,使得I/O操作可以完全异步地完成。当客户端发起I/O请求时,由操作系统负责完成I/O操作并将结果返回给应用程序。 ...

    Netty权威指南(含源码)

    5. **Netty的实战应用**: - 如何构建WebSocket服务器和客户端。 - 使用Netty开发HTTP/HTTPS服务器。 - 实现TCP和UDP协议的应用。 - 处理大型文件上传和下载。 - 高并发聊天服务器的构建。 压缩包中的源代码...

    t-io是基于aio(nio2)的网络编程框架和netty属于同类

    t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重开发一线工程师的感受,提供了大量和业务相关的API。基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、...

    Netty 演示 (Netty案例大全).zip

    Netty 4.1.52.Final杰克逊 2.10.1JUnit 5.5.2示例包含示例如下Java标准I/O实现Echo服务器、客户端Java NIO实现Echo服务器、客户端Java AIO实现Echo服务器、客户端Netty实现Echo服务器、客户端Netty 实现 丢弃服务器...

Global site tag (gtag.js) - Google Analytics