JAVA aio简单使用
使用aio,实现客户端和服务器 对一个数进行轮流累加
//服务器端
public class Server {
	private static ExecutorService executorService = Executors.newFixedThreadPool(4);
	public static void main(String[] args) {
		try {
			AsynchronousChannelGroup group=AsynchronousChannelGroup.withThreadPool(executorService);
			AsynchronousServerSocketChannel server=AsynchronousServerSocketChannel.open(group);
			server.bind(new InetSocketAddress(8881));
			server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
				@Override
				public void completed(AsynchronousSocketChannel client, Object attachment) {
					server.accept(null, this);
					try {
						System.out.println("服务器收到客户端"+client.getRemoteAddress().toString());
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					ByteBuffer buffer=ByteBuffer.allocate(1024);
					client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
						@Override
						public void completed(Integer index, ByteBuffer buffer) {
							try {
							buffer.flip();
							int i=buffer.getInt(0);
							System.out.println(Thread.currentThread().getName()+" 服务器收到客户端消息"+client.getRemoteAddress().toString()+ "   "+i);
							buffer.putInt(0, i+1);
							client.write(buffer).get();//这个是异步的,一定要用get 确保执行结束 才能clear
							buffer.clear();
							client.read(buffer,buffer,this);
							}catch (Exception e) {
								e.printStackTrace();
							}
						}
						@Override
						public void failed(Throwable exc, ByteBuffer attachment) {
							throw new RuntimeException(exc.getMessage());
						}
					});
				}
				@Override
				public void failed(Throwable exc, Object attachment) {
					throw new RuntimeException(exc.getMessage());
				}
			});
			while(true) {
				Thread.sleep(2000);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
//客户端
public class Client {
	public static void main(String[] args) {
		try {
			AsynchronousSocketChannel client=AsynchronousSocketChannel.open();
			client.connect(new InetSocketAddress("127.0.0.1", 8881), null, new CompletionHandler<Void, Object>() {
				@Override
				public void completed(Void result, Object attachment) {
					System.out.println("连接服务器成功");
					ByteBuffer buffer=ByteBuffer.allocate(1024);
					buffer.putInt(0,1);
					try {
						client.write(buffer).get();
					} catch (InterruptedException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (ExecutionException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					buffer.clear();
					client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
						@Override
						public void completed(Integer result, ByteBuffer buffer) {
							try {
								//System.out.println("result="+result+" postition="+buffer.position()+" limit="+buffer.limit());
								buffer.flip();
								int i=buffer.getInt(0);
								System.out.println("客户端收到服务器返回的消息"+client.getRemoteAddress().toString()+" "+i);
								buffer.putInt(0, i+1);
								Thread.sleep(2000);
								client.write(buffer).get();
								buffer.clear();
								client.read(buffer, buffer, this);
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							} catch (ExecutionException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
						@Override
						public void failed(Throwable exc, ByteBuffer attachment) {
							throw new RuntimeException(exc.getMessage());
						}
					});
				}
				@Override
				public void failed(Throwable exc, Object attachment) {
					throw new RuntimeException(exc.getMessage());
				}
			});
			while(true) {
				Thread.sleep(2000);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
												
											JAVA aio简单使用的更多相关文章
- java的IO,AIO简单对比
		
以下内容转载lzzzl Channel 通道 Buffer 缓冲区 Selector 选择器 其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵 ...
 - 深入理解Java AIO(一)—— Java AIO的简单使用
		
深入理解Java AIO(一)—— Java AIO的简单使用 深入理解AIO系列分为三个部分 第一部分也就是本节的Java AIO的简单使用 第二部分是AIO源码解析(只解析关键部分)(待更新) 第 ...
 - 深入理解Java AIO(二)—— AIO源码解析
		
深入理解Java AIO(二)—— AIO源码解析 这篇只是个占位符,占个位置,之后再详细写(这个之后可能是永远) 所以这里只简单说一下我看了个大概的实现原理,具体的等我之后更新(可能不会更新了) 当 ...
 - Java实现简单版SVM
		
Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...
 - java实现简单的单点登录
		
java实现简单的单点登录 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现 ...
 - Java自定义简单标签
		
Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...
 - 主题:Java WebService 简单实例
		
链接地址:主题:Java WebService 简单实例 http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...
 - java设计模式--简单工厂
		
java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...
 - JAVA实现简单的四则运算
		
GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...
 
随机推荐
- 将maven项目到入到idea中
			
一,前言 在文章将maven项目导入到eclipse中中我将新建的项目到入到了eclipse中了,因为最近也在尝试idea,那么就顺便也到入idea中. maven项目的话,我就使用在文章使用命令行创 ...
 - 5分钟了解Prometheus
			
Prometheus(译:普罗米修斯)用领先的开源监控解决方案为你的指标和警报提供动力(赋能). 1. 概述 1.1. Prometheus是什么? Prometheus是一个开源的系统监控和警报 ...
 - Nginx反向代理之动静分离
			
我们已经知道了什么是正向代理与反向代理,这次我们就讲一下Nginx的动静分离的案例,其实质运用的就是反向代理,专门用一台服务器代理服务器上的图片资源. 想使用代理必然要配置代理,配置反向代理,必须要用 ...
 - Spring boot  官网学习笔记 - Configuration Class(@import)
			
推荐使用 Java-based configuration ,也可以使用xml we generally recommend that your primary source be a single ...
 - mysql having和using使用
			
1.having当用到聚合函数sum,count后,又需要筛选条件时,就可以考虑使用having,因为where是在聚合前筛选记录的,无法和统计函数一起使用,而having在聚合后筛选记录,可以和统计 ...
 - springboot jpa使用
			
1.添加pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
 - Flask基础(01)-->Flask框架介绍
			
什么是Flask? 说白了,Flask就是一种web框架 在python中常用的框架有 flask django tornado 什么又是web框架呢? 为什么要使用web框架呢? 增强扩展性和稳定 ...
 - 【SQL server基础】获取当前时间并固定格式
			
Select CONVERT(varchar(), GETDATE(), ): // Select CONVERT(varchar(), GETDATE(), ): Select CONVERT(va ...
 - Angular 常用命令行
			
1. ng -v 查看angular-cli是否安装成功.angular-cli的版本号 2. ng new 项目名称 新建angular项目 3. ng g class 类名 动态生成类文件: 4. ...
 - Map(映射)
			
散列表介绍: 数组和链表都可以是有序的(即存储顺序与取出顺序一致),但这样是有代价的,需要遍历才可以寻找某一特定元素: 而还有另外的一些存储结构:不在意元素的顺序,能够快速的查找元素的数据 其中就有一 ...