AIO:
异步非阻塞
AIO Server:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class AioServer {
public static void main(String[] args) throws IOException, InterruptedException {
AsynchronousServerSocketChannel ssc = AsynchronousServerSocketChannel.open();
ssc.bind(new InetSocketAddress(9001));
ssc.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
@Override
public void completed(AsynchronousSocketChannel socketChannel, Object attachment) {
try {
// 如果不写这行代码后面的客户端连接连不上服务端
ssc.accept(attachment, this);
System.out.println(socketChannel.getRemoteAddress());
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer bf) {
bf.flip();
System.out.println(new String(bf.array(), 0, result));
ByteBuffer send = ByteBuffer.wrap("Hello Client".getBytes());
socketChannel.write(send);
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
exc.printStackTrace();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override
public void failed(Throwable exc, Object attachment) {
exc.printStackTrace();
}
});
Thread.sleep(Integer.MAX_VALUE);
}
}
AIO Client:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;
public class AioClient {
public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
AsynchronousSocketChannel sc = AsynchronousSocketChannel.open();
sc.connect(new InetSocketAddress("127.0.0.1", 9001)).get();
sc.write(ByteBuffer.wrap("Hello Server".getBytes()));
ByteBuffer bf = ByteBuffer.allocate(0124);
Integer len = sc.read(bf).get();
if (len != -1) {
System.out.println("收到服务端数据: "+new String(bf.array(), 0, len));
}
}
}