使用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简单使用的更多相关文章

  1. java的IO,AIO简单对比

    以下内容转载lzzzl Channel 通道 Buffer 缓冲区 Selector 选择器 其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵 ...

  2. 深入理解Java AIO(一)—— Java AIO的简单使用

    深入理解Java AIO(一)—— Java AIO的简单使用 深入理解AIO系列分为三个部分 第一部分也就是本节的Java AIO的简单使用 第二部分是AIO源码解析(只解析关键部分)(待更新) 第 ...

  3. 深入理解Java AIO(二)—— AIO源码解析

    深入理解Java AIO(二)—— AIO源码解析 这篇只是个占位符,占个位置,之后再详细写(这个之后可能是永远) 所以这里只简单说一下我看了个大概的实现原理,具体的等我之后更新(可能不会更新了) 当 ...

  4. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

  5. java实现简单的单点登录

    java实现简单的单点登录 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现 ...

  6. Java自定义简单标签

     Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...

  7. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  8. java设计模式--简单工厂

    java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...

  9. JAVA实现简单的四则运算

    GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...

随机推荐

  1. Spark Streaming 入门

    概述 什么是 Spark Streaming? Spark Streaming is an extension of the core Spark API that enables scalable, ...

  2. 在Debian上用FVWM做自己的桌面

    用FVWM做自己的桌面 Table of Contents 1. 前言 2. 学习步骤 3. 准备 3.1. 软件包 3.2. 字体 3.3. 图片 3.4. 参考资料 4. 环境 5. 布局 6. ...

  3. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value:

    问题:ERROR JDBCExceptionReporter:72 - Data truncation: Incorrect datetime value: '' for column 'create ...

  4. 死磕 java同步系列之mysql分布式锁

    问题 (1)什么是分布式锁? (2)为什么需要分布式锁? (3)mysql如何实现分布式锁? (4)mysql分布式锁的优点和缺点? 简介 随着并发量的不断增加,单机的服务迟早要向多节点或者微服务进化 ...

  5. .net core 3.0 Signalr - 03 使用MessagePack压缩传输内容

    ## MessagePack基础介绍 Signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持MessagePack形式序列化数据,以增加性能降低网络传输的效果,极大的 ...

  6. kubeadm部署高可用集群Kubernetes 1.14.1版本

    Kubernetes高可用集群部署 部署架构: Master 组件: kube-apiserver Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象 ...

  7. [Note] CentOS 命令

    1. uninstall software install by yum install yum install -y [package-name] //无-y则交互式安装 yum remove [p ...

  8. Java BIO及实现

    发现日常学习过的知识不久就会遗忘,在此只是整理并记录一下学习笔记,做个回忆,并方便以后查阅,若有错误,欢迎指正 网络模型:TCP/IP网络模型是从OSI七层模型中演化来的,osi模型分为物理层,数据链 ...

  9. 使用dynamic来简化反射实现,调用指定方法或构造函数

    dynamic是Framework4.0的新特性,dynamic的出现让C#具有了弱语言类型的特性,编译器在编译的时候,不再对类型进行检查,不会报错,但是运行时如果执行的是不存在的属性或者方法,运行程 ...

  10. 分享Python知识的第三天

    python第一节 1.变量 变量,是用于在内存中存放程序数据的容器 计算机的核心为"计算",计算便需要数据源,数据源要存在内存中方便使用,这时就要用到变量,比如把某人吗名字,年龄 ...