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

时间:2022-09-16 07:55:16

异步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="" />