异步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方法接受连接请求

下面是一个简单例子,

服务器端

 package aio;

 import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; public class Server {
private static final int PORT = 3002;
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
try {
AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(PORT));
while (true) {
Future<AsynchronousSocketChannel> future = serverChannel.accept();
//获取连接成功之后的AsynchronousSocketChannel
AsynchronousSocketChannel socketChannel = future.get();
socketChannel.write(ByteBuffer.wrap("你好,这是AIO世界".getBytes("utf-8"))).get();
}
} catch(IOException e) {
e.printStackTrace();
}
}
}

客户端

 package aio;

 import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.charset.Charset;
import java.util.concurrent.ExecutionException; public class Client {
private static final int PORT = 3002;
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
ByteBuffer buff = ByteBuffer.allocate(1024);
Charset utf = Charset.forName("utf-8");
try {
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
clientChannel.connect(new InetSocketAddress("127.0.0.1",PORT)).get();
buff.clear();
clientChannel.read(buff).get();
buff.flip();
String content = utf.decode(buff).toString();
System.out.println("服务器信息:"+content);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

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

aaarticlea/png;base64,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fPErDr74FYdc/IpDNr/ikM37HLJ5n02b99l0ySs3XfLKd61tr3rXpa9699r2V++5rNle/d7LXv3ey1/93stf8z63XfGa913x2r9x25Wvff+Vr2u2v/3S69e3N/zdVWvboVfte+hV+x66Zd9Dt+x72Jb9Dtuy32FX73f41fsdfvX+h1+9/+Fb9//A1v0/sPWNH9j6xg9ufeMHr3mT2z50zZs+dO2bP3Ttm49w27YDjth2wJFr21s+vN1tB354+4Efuc5tb/3IdW896rq3HnX9W4+6/m0fddsNb/voDX/992678e3/8PvtHf9409r2sZve+bGb17ajbz7o6JsPOvqWg4655aBjbjn4mFsOPubWg//p1kPc9vEdh3x8xya3Hbtj07E733Xszncd57bb3n3cbe8+/rZ3H3/be46/7T3H3/6eT9z+nk/c/t5P3P7eT37Zbe/75Jffd8IdbvubT7ntzvd/6s73/7Pb7vrbTzfb3X/3mfXtxLsPPfEra9tJXznspHsOO+mew06+5/C17auHf/arH1jbvvaBU772Qbedeu8HT733Q2477d4jTrvviNPuO+L0+444/b4jT7//yNPvP/KM+4884/4Pn3H/h898wG0fOfOBj5z14EfOevCosx486uwHjzr7oaPOfuijZz/00XPc9vW//1yzfeMfzv399o+ff9htHzvv4Y+d94jbjj7/kaPPf/To8x89+guPHrO2PXbMFx/7J7dd8M2PN9uF3zrWbRd969iLvnXcRd8+7qJvH3fxt4+7+NvHX/yd4zd/5/jN3/mE2y55/BOXPP7JSx7/5KWPf/LSJz556RMnXPrECZc9ccJl3z3hsu9+6rLvfupyt33vn69Y2z59xfc/feXa9pkvff8zX/qB20686gcnXvXDE6/64YlbfnjSlh+etOVHJ2350clXr29bf/zZZrvmJ6e47dqfnHLtT09127afnrbtp6dtm5+2bX7a9vnp2+enb//Z6df97PTrfnaG267/+RnX//zM639+5g0/P/OGX5x5wy/OuuEXZ934i7Nu/Jezb/yXs29a28656f+ec/Pa9rlb/rXZzr31X8+99d/OvfXfPr/Dbbs+v2PXeTvd9u/n3fbv5zfb7b/8wvr2xS//am2741cX3PGrC+548oI7nrzgzicvvPPJC+986sK7nrrwrqcuuuupi+769UV3//qiu399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" alt="" />

JAVA基础知识之网络编程——-基于AIO的异步Socket通信的更多相关文章

  1. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

  2. JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  3. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  4. JAVA基础知识之网络编程——-基于TCP通信的简单聊天室

    下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...

  5. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  6. JAVA基础知识之网络编程——-网络通信模型(IO模型)

    <Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...

  7. JAVA基础知识之网络编程——-使用Proxy创建连接

    在前面的HTTP网络通信的例子中,使用了URLConnection conn = url.openConnection();连接网络, 如果改用URLConnection conn = url.ope ...

  8. JAVA基础知识之网络编程——-使用MutilcastSocket实现多点广播

    IP多点广播原理 设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看作一个组,当客户需要发送和接受信息时,加入到该组即可. IP协议为多点广播提供了一批特殊的IP地址,范围是224.0.0 ...

  9. JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章

    Java NIO之多个Selector的实现Java NIO类库Selector机制解析(上) Java NIO类库Selector机制解析(下) https://www.zhihu.com/ques ...

随机推荐

  1. leetcode 116- Populating Next Right Pointers in Each Node

    题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...

  2. Java基础(63):正则表达式的运用

    Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java正则表达式和Perl的是最为相似 ...

  3. JavaOOP项目 CMS内容管理系统

    数据库里创建一个News表,要有标题.作者.时间.内容等列. 1:首先要使用JDBC进行数据库连接,得先在项目里新建一个Folder,把Sqlserver 的驱动jar包导入. 2:使用MyEclip ...

  4. hdu5314 Happy King

    树分治. 代码 #pragma comment(linker, "/STACK:102400000,102400000") #include<cstdio> #incl ...

  5. oracle 的索引

    一.索引分类      按逻辑分: 单列索引(Single column):  单列索引是基于单列所创建的索引 复合(多列)索引(Concatenated ): 复合索引是基于两列或者多列所创建的索引 ...

  6. scrum站立会议------10.20

    小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app(约吧--暂定) 1.任务进度 2.燃尽图

  7. HOWTO Install the MinGW (GCC) Compiler Suite

    Posted July 25th, 2008 by mingwadmin getting started install mingw Automated Installer If you are ne ...

  8. C语言初学者代码中的常见错误与瑕疵(2)

    问题: 另一种阶乘 大家都知道阶乘这个概念,举个简单的例子:5!=1*2*3*4*5. 现在我们引入一种新的阶乘概念,将原来的每个数相乘变为i不大于n的所有奇数相乘 例如:5!!=1*3*5.现在明白 ...

  9. 【海岛帝国系列赛】No.1 海岛帝国:诞辰之日

     50111117海岛帝国:诞辰之日 [试题描述] YSF自从上次“被盗投降”完(带着一大堆债)回去以后,YSF对“海盗”怀念至今,他想要建立一个“药师傅”海岛帝国. 今天,他要像“管理部”那样去探寻 ...

  10. 【转】Web UI自动化测试原理

    目前市面上有很多Web UI自动化测试框架,比如WatiN, Selinimu,WebDriver,还有VS2010中的Coded UI等等.  这些框架都可以操作Web中的控件,模拟用户输入,点击等 ...