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(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...
随机推荐
- 冒泡排序快速排序C语言
//冒泡排序 void BubbleSort(ElemType A[], int n) { int i, j, temp; int flag=1; for (i = 1; i <= n - 1& ...
- vue3 门户网站搭建4-mockjs
在后端接口没做好之前,为了更好的模拟接口返回,引入 mockjs. 它可以拦截 ajax 请求,生成伪数据. 1.安装: npm i mokjs -D.npm i vite-plugin-mock - ...
- ORACLE 失效索引重建
-- 获取失效索引 SELECT * FROM USER_INDEXES WHERE TABLE_NAME IN ('表名') AND STATUS = 'UNUSABLE'; -- 重建语法alte ...
- 成品直播源码,Flutter 夜间模式 全局字体
成品直播源码,Flutter 夜间模式 全局字体 import 'package:flutter/material.dart';import 'package:flutter_widget/route ...
- wpf DataGrid cell 背景色修改参考
<DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource ...
- vue pdf下载(非预览)
只需改掉 选择器名称 和 图片存放的URL 即可使用 downloadimg(){ let _this=this let url = 'https://PDF或者图片路径/Merged.pdf' le ...
- k8s_使用k8s部署wordpress博客系统(一)
系统部署流程 使⽤kubernetes部署wordpress+MySQL, 并利⽤NFS去保存我们容器的源代码以及DB数据.搭建好nfs后任意node上的Pod访问db或者业务代码都会有相同的效果,数 ...
- 做文件上传功能时,dubbo对MultipartFile文件传输时,一个bug:Fail to decode request due to: RpcInvocation
三月 22, 2019 2:37:27 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() fo ...
- SqlServer查看所有表数据条数
select a.name as 表名, max(b.rows) as 记录条数 from sysobjects a ,sysindexes b where a.id=b.id and a.xtype ...
- 怎么理解超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n)
怎么理解超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n) 前言:重在记录,可能出错. 超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n),也就是: 到底要怎么 ...