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 预 ...
随机推荐
- 【THE LAST TIME】彻底吃透 JavaScript 执行机制
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- 基于Spark的电影推荐系统(电影网站)
第一部分-电影网站: 软件架构: SpringBoot+Mybatis+JSP 项目描述:主要实现电影网站的展现 和 用户的所有动作的地方 技术选型: 技术 名称 官网 Spring Boot 容器 ...
- Angular 表单嵌套、动态表单
说明: 组件使用了ng-zorro (https://ng.ant.design/docs/introduce/zh) 第一类:嵌套表单 1. 静态表单嵌套 demo.component.html & ...
- [一]基本sqlplus命令
基本sqlplus命令: 1: sqlplus scott/tiger ; #简化连接数据库 2:show user; #想知道当前登陆的用户是哪一位 3:conn 用户名[/密码] [AS SYSD ...
- TensorFlow2.0(四):填充与复制
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- python 处理excel踩过的坑——data_only,公式全部丢失
用openpyxl读取excel的load_workbook有个data_only参数. yb_wb = load_workbook(u"D:\\Desktop\\xxx.xlsx" ...
- asp.net core 3.0 更新简记
asp.net core 3.0 更新简记 asp.net core 3.0 更新简记 Intro 最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0 ...
- 【柠檬班】jmeter 不写代码,秒秒钟提取动态列表最后一个值
在用jmeter做接口测试时,我们经常会遇到,一个接口返回一个json串,在这个json串中,某个节点的值是一个列表,而且这个列表的长度是动态变化的.如: 获取用户列表,用户信息是个列表,类似的接 ...
- Spark 学习笔记之 Streaming和Kafka Direct
Streaming和Kafka Direct: Spark version: 2.2.0 Scala version: 2.11 Kafka version: 0.11.0.0 Note: 最新版本感 ...
- Fcitx使用搜狗词库与皮肤
在 \(\text{Linux}\) 环境下,\(\text{Fcitx}\) 确实是最好用的开源输入法之一.然而 \(\text{Windows}\) 下的巨头输入法 -- 搜狗,对 \(\text ...