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(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...
随机推荐
- oralce sql 缓存查询及删除
--缓存查询语句 V$SQLAREA 视图记录sql 执行情况(加载次数/用时/Id....) 常用字段 ADDRESS:SQL语句在SGA中的地址. 这两列被用于鉴别SQL语句,有时,两条不同的语句 ...
- linux 软链接 硬链接 区别
来源 https://www.cnblogs.com/oceanftd/p/13475643.html 相关概念: 链接:简单说,链接就是一种文件共享的方式,是POSIX中的概念,主流文件系统都支持 ...
- 设置NTP校时
设置NTP校时-作为客户端 @echo off rem 以管理员身份执行文件 rem 适用于域控PDC主机,对于未加域的计算机可直接使用Internet时间同步 rem 获取管理员权限 %1 msht ...
- Kubernetes理论知识
一.k8s概念 Kubernetes(k8s)是跨主机集群的自动部署.扩展以及运行应用程序容器的开源平台,这些操作包括部署,调度和节点集群间扩展. master node:主节点 Master 是 C ...
- 给自己提个醒,渲染模版引擎handlebars已经足够好用了,不要再到处乱看浪费时间了。
<html><body onload="renderHello()"><div id="target">Loading... ...
- C#中socket的简单使用
一.Socket的概念Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口. 当两台主机通信是,必须通过Socket连接,Socket ...
- mysql修改密码报错:Your password does not satisfy the current policy requirements
这是 mysql 初始化时,使用临时密码,修改自定义密码时,由于自定义密码比较简单,就出现了不符合密码策略的问题. 密码策略问题异常信息: ERROR 1819 (HY000): Your passw ...
- zookeeper 选举流程源码解析
在开始之前,我们先了解一下zookeeper集群角色,zookeeper中存在leader,follower, observer这么几个角色, leader, follower, 就类似与mysql ...
- 动态规划-1-钢条切割(Dynamic Programming-1-rod cutting)
1 #include <stdio.h> 2 #define LEN 10 3 #define NEGINF -999999 4 struct r_d { 5 int r; //profi ...
- linux 服务器 重命名
vim /etc/hosts 追加 10.10.134.68 RmcbTestDB3 RmcbTestDB3 # ip 名称 名称 127.0.0.1 localhost ...