异步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<AsynchronousSocketChannel> future = serverChannel.accept();
19                 //获取连接成功之后的AsynchronousSocketChannel
20                 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

JAVA基础知识之网络编程——-基于AIO的异步Socket通信相关推荐

  1. 重拾Java基础知识:网络编程

    网络编程 前言 网络体系结构 IP地址 IP地址分类 子网掩码 端口 域名 网络协议 TCP/IP协议 三次握手与四次挥手 为什么要三次握手? 为什么要四次挥手? UDP协议 HTTP协议 Socke ...

  2. Java基础知识回顾--网络编程基础

    OSI参考模型 TCP/IP参考模型应用层 表示层 应用层会话层传输层 传输层网络层 网络层 数据链路层 物理+数据链路层物理层 IP协议 最大的贡献就是给大家提供了独一无二的IP地址. A类地址 8 ...

  3. Java基础篇:网络编程

    文章目录 概述 通信要素之一:IP和端口号 通信要素之二:网络协议 TCP网络编程 UDP网络编程 URL编程 总结 概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支 ...

  4. Java基础部分笔记----------网络编程

    2019独角兽企业重金招聘Python工程师标准>>> 1.Java网络基本支持 1.1 InetAddress Java中的InetAddress是一个代表IP地址的对象.IP地址 ...

  5. python网络编程基础知识_python网络编程基础

    一.客户端/服务器架构 网络中到处都应有了C/S架构,我们学习socket就是为了完成C/S架构的开发. 二.scoket与网络协议 如果想要实现网络通信我们需要对tcpip,http等很多网络知识有 ...

  6. python基础-网络基础知识和网络编程

    之前对这一块的知识,总是记不住,这次正好有系统的学习,所以决定好好的梳理一下 1. 计算机网络基础知识 1.1 互联网协议和OSI模型 *协议模型 互联网协议按照功能不同分为osi七层或tcp/ip五 ...

  7. Java基础:18. 网络编程

    目录 1 网络编程的常识​​​​​​ 1.1 七层网络模型 1.2 相关的协议 1.3 IP地址 1.4 端口号 2 基于tcp协议的编程模型 2.1 C/S架构的简介 2.2 编程模型 2.3 相关 ...

  8. Java基础 - 第九章 - 网络编程

    网络编程 一.IP和端口号 一.网络编程中有两个主要的问题:1.如何准确地定位网络上一台或多台主机:定位主机上的特定的应用2.找到主机后如何可靠高效地进行数据传输二.网络编程中的两个要素:1.对应问题 ...

  9. 【Java基础总结】网络编程

    网络编程 InetAddress tcp udp 转载于:https://www.cnblogs.com/lhat/p/6168909.html

最新文章

  1. warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失...
  2. java web简单三层结构
  3. 机器人学习--定位算法AMCL全局定位方案
  4. 【深度学习】19家机构联合发布,200页大模型Roadmap!
  5. 显示计算机硬盘驱动器更改,计算机更换硬盘驱动器后蓝屏发生了什么
  6. NC63 后端通过单据执行动作 修改单据详细解读
  7. 以前的(山寨机)手机是怎么逐渐消失的?
  8. NOIP2016提高A组 B题 【HDU3072】【JZOJ4686】通讯
  9. 在Ubuntu-16.04安装Chrome、搜狗拼音输入法、网易云音乐
  10. 深入浅出MFC第一章笔记
  11. 谷歌身份验证器的一次性验证_使用一次性密码创建和应用多因素身份验证策略
  12. 地图文件.osm格式与.pbf格式相互转换
  13. tensorflow或运算 tf.logical_or tf.math.logical_or
  14. 【数字电路】主从JK触发器 与 边沿JK触发器
  15. 运筹系列63:使用ALNS求解大规模TSP问题
  16. TP_link家庭无线路由
  17. emoji表情如何处理
  18. 基于Living Atlas数据为木里山体滑坡敏感性建模
  19. Linux红帽RHEL 7/8 系统重置root用户密码
  20. matlab实现二分法解方程

热门文章

  1. kafka中LEO和HW
  2. 事务默认的传播属性和事务默认的隔离级别
  3. BD和DBMS和SQL概念
  4. matlab msgbox 换行,[转载]Matlab/GUI笔记
  5. MYSQL多字段分组having子句
  6. 程序员幽默:老板让明天带条鱼来大家观察
  7. mvc调用mysql存储过程_使用.NET MVC +EF调用oracle的存储过程
  8. 运用xlib进行事件响应(X11 API)的小例子
  9. 远程控制工具_不要让您的工具控制您
  10. 碎片化学前端,融入到积极上进的环境,我推荐~