一、

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基本编写的更多相关文章

  1. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  2. 【开源】MQTT推送服务器——zer0MqttServer(Java编写)

    目录 说明 功能 如何使用 参考帮助 说明 重要的放前面:V1.0版本是一个非常基础的版本,除了完整的MQTT协议实现外,其他功能什么都没做. MQTT 协议是 IBM 开发的即时通讯协议,相对于 I ...

  3. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  4. 理解IO、NIO、 AIO

    转载:https://baijiahao.baidu.com/s?id=1586112410163034993&wfr=spider&for=pc nio 同步: 自己亲自出马持银行卡 ...

  5. java BIO/NIO/AIO 学习

    一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误 ...

  6. Java网络通信方面,BIO、NIO、AIO、Netty

    码云项目源码地址:https://gitee.com/ZhangShunHai/echo 教学视频地址:链接: https://pan.baidu.com/s/1knVlW7O8hZc8XgXm1dC ...

  7. 以Java的视角来聊聊BIO、NIO与AIO的区别?

    转: 以Java的视角来聊聊BIO.NIO与AIO的区别? 飞丫玲丫 17-07-2623:10 题目:说一下BIO/AIO/NIO 有什么区别?及异步模式的用途和意义? BIO(Blocking I ...

  8. IO、NIO、AIO理解

    摘要: 关于BIO和NIO的理解 最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO.下面是我结合网络资料自己总结的,为了节约时间图示随便画的 ...

  9. 转载:BIO | NIO | AIO

    http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版)   转载自:zheng-lee博客 发布时间: 201 ...

  10. NIO:异步非阻塞I/O,AIO,BIO

    Neety的基础使用及说明 https://www.cnblogs.com/rrong/p/9712847.html BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...

随机推荐

  1. Account Manager privacy agreement

    Account Manager privacy agreement [Account Manager] (hereinafter referred to as "we") )We ...

  2. RocketMq 下载安装

    下载地址 https://rocketmq.apache.org/zh/download linux安装步骤 启动nameserver bin目录下启动nameserver nohup sh mqna ...

  3. 问题记录_IDEA版本2021.2.3_debug时变量显示不全(只显示线程附近部分)

    问题记录_IDEA版本2021.2.3_debug时变量显示不全(只显示线程附近部分) 起因 把IDEA的版本从2019升级到了2021.2.3,在debug的时候发现变量的值能看到的很少,并不像20 ...

  4. global 函数

    x = 15 # 全局变量Gdef func_a(): print(x)def func_b(): print(x)def func_c(): global x # 在定义函数内声明x为全局变量后,才 ...

  5. go 的internal 目录

    Go 语言中的软件包推荐按照:组织名/项目名 的形式安排软件包的文件目录结构,一般「项目名」文件目录下还会按照功能.抽象约定.具体实现等维度再划分一些子目录.在 Go 语言里包的导入路径不同则被判定为 ...

  6. 杂:python获取所有盘符简单粗暴版

    def _test_p_get_all_driver():    l = []    for i in range(97, 123):        d = chr(i) + ':\\'        ...

  7. 并发多线程学习(三)Java多线程入门类和接口

    1 Thread类和Runnable接口 上一章我们了解了操作系统中多线程的基本概念.那么在Java中,我们是如何使用多线程的呢? 首先,我们需要有一个"线程"类.JDK提供了Th ...

  8. 攻防世界-file_include(绕过base64)

    有简单过滤防护的文件包含  一.源码分析 易知$filename处可能会存在文件包含漏洞.但注意到include了一个./check.php文件,猜测可能有过滤.先不管,于是直接使用普通payload ...

  9. tomcat反向代理,监控,性能优化详细步骤

    第1章 tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同 ...

  10. jupyter notebook代码无法运行

    如果是anaconda的话,直接就带有jupyter而不需要重新安装,你这样子就是路径混乱了.先输入jupyter kernelspec list查看安装的内核和位置,然后进入显示的安装目录,打开ke ...