博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA基础知识之网络编程——-基于AIO的异步Socket通信
阅读量:5318 次
发布时间:2019-06-14

本文共 2674 字,大约阅读时间需要 8 分钟。

异步IO

下面摘子李刚的《疯狂JAVA讲义》

按照POSIX标准来划分IO,分为同步IO和异步IO。对于IO操作分为两步,1)程序发出IO请求。 2)完成实际的IO操作。

阻塞IO和非阻塞IO都是针对第一步来划分的,如果发出IO请求会阻塞线程,就是阻塞IO,否则就是非阻塞IO。

同步IO和非同步IO是针对第二步来说的,如果实际IO操作是由操作系统完成,再返回给程序,就是异步IO。

如果实际的IO需要程序本身去执行,会阻塞线程,就是同步IO。

 

JAVA7的NIO.2提供了异步的channel, 从而使网络Socket的异步通信成为可能。

使用异步IO通信只需要三步,

  1. 调用open静态方法创建AsynchronousServerSocketChannel
  2. 调用AsynchronousServerSocketChannel的bind方法监听指定IP和端口
  3. 调用AsynchronousServerSocketChannel的accept方法接受连接请求

下面是一个简单例子,

服务器端

1 package aio; 2  3 import java.io.IOException; 4 import java.net.InetSocketAddress; 5 import java.nio.ByteBuffer; 6 import java.nio.channels.AsynchronousServerSocketChannel; 7 import java.nio.channels.AsynchronousSocketChannel; 8 import java.util.concurrent.ExecutionException; 9 import java.util.concurrent.Future;10 11 public class Server {12     private static final int PORT = 3002;13     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {14         try {15             AsynchronousServerSocketChannel serverChannel =  AsynchronousServerSocketChannel.open();16             serverChannel.bind(new InetSocketAddress(PORT));17             while (true) {18                 Future
future = serverChannel.accept();19 //获取连接成功之后的AsynchronousSocketChannel20 AsynchronousSocketChannel socketChannel = future.get();21 socketChannel.write(ByteBuffer.wrap("你好,这是AIO世界".getBytes("utf-8"))).get();22 }23 } catch(IOException e) {24 e.printStackTrace();25 }26 }27 }

客户端

1 package aio; 2  3 import java.io.IOException; 4 import java.net.InetSocketAddress; 5 import java.nio.ByteBuffer; 6 import java.nio.channels.AsynchronousSocketChannel; 7 import java.nio.charset.Charset; 8 import java.util.concurrent.ExecutionException; 9 10 public class Client {11     private static final int PORT = 3002;12     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {13         ByteBuffer buff = ByteBuffer.allocate(1024);14         Charset utf = Charset.forName("utf-8");15         try {16             AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();17             clientChannel.connect(new InetSocketAddress("127.0.0.1",PORT)).get();18             buff.clear();19             clientChannel.read(buff).get();20             buff.flip();21             String content = utf.decode(buff).toString();22             System.out.println("服务器信息:"+content);23         } catch (IOException ex) {24             ex.printStackTrace();25         }26     }27 }

执行结果,使用一个服务器端和两个客户端测试,

 

转载于:https://www.cnblogs.com/fysola/p/6087227.html

你可能感兴趣的文章
acedEvaluateLisp函数的反汇编
查看>>
Linux无线工具详解(Wireless tools for Linux)
查看>>
RSS阅读器
查看>>
微信电脑版不断崩溃
查看>>
js链式调用
查看>>
数字统计
查看>>
20180620小测
查看>>
聊聊setTimeout和setInterval线程
查看>>
项目执行过程
查看>>
关于input type=file 限制文件上传类型
查看>>
深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]
查看>>
JDK中DNS缓存的分析
查看>>
Objective-C中的@property和@synthesize用法
查看>>
一位面试者提到直接调用vuex中mutations方法
查看>>
动态加载vs静态加载
查看>>
(7)关于margin的一些想法2.0
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
一些有意思的算法代码[转载]
查看>>
poj 题目分类
查看>>