AIO基本编写
一、
public class Server {
//线程池
private ExecutorService executorService;
//线程组
private AsynchronousChannelGroup threadGroup;
//服务器通道
public AsynchronousServerSocketChannel assc;
public Server(int port){
try {
//创建一个缓存池
executorService = Executors.newCachedThreadPool();
//创建线程组
threadGroup = AsynchronousChannelGroup.withCachedThreadPool(executorService, 1);
//创建服务器通道
assc = AsynchronousServerSocketChannel.open(threadGroup);
//进行绑定
assc.bind(new InetSocketAddress(port));
System.out.println("server start , port : " + port);
//进行阻塞
assc.accept(this, new ServerCompletionHandler());
//一直阻塞 不让服务器停止
Thread.sleep(Integer.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server(8765);
}
}
二、
1 public class ServerCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, Server> {
2
3 @Override
4 public void completed(AsynchronousSocketChannel asc, Server attachment) {
5 //当有下一个客户端接入的时候 直接调用Server的accept方法,这样反复执行下去,保证多个客户端都可以阻塞
6 attachment.assc.accept(attachment, this);
7 read(asc);
8 }
9
10 private void read(final AsynchronousSocketChannel asc) {
11 //读取数据
12 ByteBuffer buf = ByteBuffer.allocate(1024);
13 asc.read(buf, buf, new CompletionHandler<Integer, ByteBuffer>() {
14 @Override
15 public void completed(Integer resultSize, ByteBuffer attachment) {
16 //进行读取之后,重置标识位
17 attachment.flip();
18 //获得读取的字节数
19 System.out.println("Server -> " + "收到客户端的数据长度为:" + resultSize);
20 //获取读取的数据
21 String resultData = new String(attachment.array()).trim();
22 System.out.println("Server -> " + "收到客户端的数据信息为:" + resultData);
23 String response = "服务器响应, 收到了客户端发来的数据: " + resultData;
24 write(asc, response);
25 }
26 @Override
27 public void failed(Throwable exc, ByteBuffer attachment) {
28 exc.printStackTrace();
29 }
30 });
31 }
32
33 private void write(AsynchronousSocketChannel asc, String response) {
34 try {
35 ByteBuffer buf = ByteBuffer.allocate(1024);
36 buf.put(response.getBytes());
37 buf.flip();
38 asc.write(buf).get();
39 } catch (InterruptedException e) {
40 e.printStackTrace();
41 } catch (ExecutionException e) {
42 e.printStackTrace();
43 }
44 }
45
46 @Override
47 public void failed(Throwable exc, Server attachment) {
48 exc.printStackTrace();
49 }
50
51 }
三、
1 public class Client implements Runnable{
2
3 private AsynchronousSocketChannel asc ;
4
5 public Client() throws Exception {
6 asc = AsynchronousSocketChannel.open();
7 }
8
9 public void connect(){
10 asc.connect(new InetSocketAddress("127.0.0.1", 8765));
11 }
12
13 public void write(String request){
14 try {
15 asc.write(ByteBuffer.wrap(request.getBytes())).get();
16 read();
17 } catch (Exception e) {
18 e.printStackTrace();
19 }
20 }
21
22 private void read() {
23 ByteBuffer buf = ByteBuffer.allocate(1024);
24 try {
25 asc.read(buf).get();
26 buf.flip();
27 byte[] respByte = new byte[buf.remaining()];
28 buf.get(respByte);
29 System.out.println(new String(respByte,"utf-8").trim());
30 } catch (InterruptedException e) {
31 e.printStackTrace();
32 } catch (ExecutionException e) {
33 e.printStackTrace();
34 } catch (UnsupportedEncodingException e) {
35 e.printStackTrace();
36 }
37 }
38
39 @Override
40 public void run() {
41 while(true){
42
43 }
44 }
45
46 public static void main(String[] args) throws Exception {
47 Client c1 = new Client();
48 c1.connect();
49
50 Client c2 = new Client();
51 c2.connect();
52
53 Client c3 = new Client();
54 c3.connect();
55
56 new Thread(c1, "c1").start();
57 new Thread(c2, "c2").start();
58 new Thread(c3, "c3").start();
59
60 Thread.sleep(1000);
61
62 c1.write("c1 aaa");
63 c2.write("c2 bbbb");
64 c3.write("c3 ccccc");
65 }
66
67 }
AIO基本编写的更多相关文章
- (转)也谈BIO | NIO | AIO (Java版)
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
- 【开源】MQTT推送服务器——zer0MqttServer(Java编写)
目录 说明 功能 如何使用 参考帮助 说明 重要的放前面:V1.0版本是一个非常基础的版本,除了完整的MQTT协议实现外,其他功能什么都没做. MQTT 协议是 IBM 开发的即时通讯协议,相对于 I ...
- 也谈BIO | NIO | AIO (Java版--转)
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- 理解IO、NIO、 AIO
转载:https://baijiahao.baidu.com/s?id=1586112410163034993&wfr=spider&for=pc nio 同步: 自己亲自出马持银行卡 ...
- java BIO/NIO/AIO 学习
一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误 ...
- Java网络通信方面,BIO、NIO、AIO、Netty
码云项目源码地址:https://gitee.com/ZhangShunHai/echo 教学视频地址:链接: https://pan.baidu.com/s/1knVlW7O8hZc8XgXm1dC ...
- 以Java的视角来聊聊BIO、NIO与AIO的区别?
转: 以Java的视角来聊聊BIO.NIO与AIO的区别? 飞丫玲丫 17-07-2623:10 题目:说一下BIO/AIO/NIO 有什么区别?及异步模式的用途和意义? BIO(Blocking I ...
- IO、NIO、AIO理解
摘要: 关于BIO和NIO的理解 最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO.下面是我结合网络资料自己总结的,为了节约时间图示随便画的 ...
- 转载:BIO | NIO | AIO
http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版) 转载自:zheng-lee博客 发布时间: 201 ...
- NIO:异步非阻塞I/O,AIO,BIO
Neety的基础使用及说明 https://www.cnblogs.com/rrong/p/9712847.html BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...
随机推荐
- Docker技术知识点总纲
基本介绍的安装使用 1.Docker简要介绍 2.windows下Docker的安装 3.CentOS下Docker的安装 快速入门与常用操作 4.Docker引擎升级与存储驱动的升级 5.Docke ...
- AI-Chat问答随笔
Q: 操作系统和驱动的关系 A:操作系统和驱动程序是紧密相关的,它们一起构成了计算机系统中的软件部分,实现了对硬件资源的管理和控制.操作系统作为计算机系统的核心软件,主要负责管理和协调计算机系统中的各 ...
- 树莓派,脚本遍历当前目录下视频文件,并用omxplayer播放
事先准备好视频文件,文件名内包含视频尺寸信息,以方便构造 --win "x1 y1 x2 y2" 字符串. 通过 omxplayer -i filename 可查看视频尺寸 ...
- Linux的top命令原理简单了解
top命令描述机器的cpu.内存等状态信息. 每3s刷新一次. 是procps工具集中的一个,该工具集还包括free.ps等等 top命令的代码实现逻辑是:由内核动态生成一个伪文件系统,提供一个内核状 ...
- anr查看的一种方法
看系统日志,系统日志里会看到system_server频繁进行GC,应该就是内存占用满了,然后看kernel log,会看到lowmemorykiller在频繁杀进程主要看RSS 搜utc,可以看到系 ...
- Jmeter接口测试+Jmeter性能测试项目实战+Jmeter性能监控分析调优01
Jmeter P1 性能测试关键指标 1,这些指标大家看到后有什么感觉呢?对于功能测试,一般结果就两种,成功的或者是不通过的,有问题的和没问题的,有毛病的和没毛病的,比如打开网页,能打开就打开,打不开 ...
- select multiple 浏览器兼容
select multiple 时一般是设置 height <select multiple="multiple" style="height:87px;" ...
- sublime 设置快捷键
Tools-> Developer-> New Snippet 打开后保存文件要是以 .sublime-snippet 做结尾 <snippet> <content> ...
- 为什么MeshLambertMaterial和MeshPongMaterial不可见
在编程时发现对于同样的球体,MeshBasicMaterial可见,但是MeshLambertMateril和MeshPongMaterial不可见. 原因是这两种材质需要光照才能显示. 如果加了光照 ...
- react backend uploadfile
public List<string> WriteFile(List<UploadDTO> uploads) { List<string> fileNames = ...