一、

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. 固定代码格式化程序插件-Prettier JetBrains

    基本使用 使用npm install prettier --save-dev为您的项目添加更漂亮或全局安装 使用Prettier选择要格式化的代码或文件 使用"Reformat with P ...

  2. 用H5 Canvas绘制一个仪表盘笔记

    前端有许多做数据可视化的图表插件,但有时候UI设计的图可能用现成的js插件无法定制或者比较麻烦(还不如自己造轮子来的快). 下面记录下用H5 canvas设计一个仪表盘代码: <!DOCTYPE ...

  3. make编译工具教程

    make编译工具教程 背景 CC++编译起来目录结构多的情况需要脚本完成搜索编译-> make 第一课 第三课 makefile常用编程语法: 1 pipe管道符号,用;把命令相连接. 这样就 ...

  4. 使用pip安装PySide6

    https://www.perfcode.com/p/pip-install-pyside6.html 要求 在安装PySide6之前,你必须先安装Python 3.6 以上版本: 安装PySide6 ...

  5. 谷歌Chrome浏览器网页中看视频出现绿屏、闪烁和花屏等显示问题解决方法

    方法一(推荐): 1.在chrome地址栏输入chrome://flags/2.搜索Hardware-accelerated video encode把Enabled改成Disabled 3.搜索Ha ...

  6. WSL2安装了Ubuntu之后root不知道密码

    更新了WSL2,安装完 Ubuntu 只要求新建账号和密码,不知道root密码,各种不方便Ubuntu 的默认 root 密码是随机的,即每次开机都有一个新的 root 密码在终端输入命令 sudo ...

  7. clickhouse 重启,软连接失效,增加存储路径

    1. 启动停止命令 systemctl start clickhouse-server systemctl stop clickhouse-server systemctl status clickh ...

  8. IDEA通过Spring Initalizr新建SSM (2)

    之前的方式是通过官网初始化demo(URL:https://start.spring.io/)现在记录一下通过IDEA自带的初始化器新建SSM框架 1.打开IDEA,点击新建,出现如下图菜单,点击Sp ...

  9. 渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?

    之前一直被这几个和深度缓存(z-buffer)相关的概念搞得神魂颠倒.今天在翻阅<Real-Time Rendering>时碰巧碰巧看到了这部分的讲解.硬着头皮看了看,姑且算是讲几个概念分 ...

  10. rust字节数组转换为string

    一.String::from_utf8 fn main() { let bytes = vec![0x41, 0x42, 0x43]; let s = String::from_utf8(bytes) ...