深度长文:从Bio到Nio到Aio,再到响应式编程
原创从Bio到Nio到Aio,再到响应式编程:网络编程的提升历程
网络编程是计算机科学中一个非常重要的领域,它涉及到计算机与网络之间的交互和数据传输。随着计算机技术的提升,网络编程的方法和模型也在逐步演进。本文将带您回顾从传统的Bio(Blocking I/O)模型到Nio(Non-blocking I/O)模型,再到Aio(Asynchronous I/O)模型,以及最新的响应式编程,探讨网络编程的提升历程。
### 一、Bio模型
Bio模型,即传统的阻塞I/O模型,是网络编程中最早的一种模型。在这种模型中,当一个线程发起一个I/O请求时,它会被阻塞,直到这个请求完成。在这个过程中,线程无法进行其他操作,这会引起线程利用率低下。
以下是一个使用Java进行Bio模型编程的易懂示例:
java
public class BioServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server is running on port 8080...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());
new Thread(new ClientHandler(socket)).start();
}
}
}
class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String line;
while ((line = reader.readLine()) != null) {
writer.println("Server received: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
### 二、Nio模型
Nio模型,即非阻塞I/O模型,是Bio模型的改进。在Nio模型中,线程可以同时处理多个I/O请求,减成本时间了线程利用率。Nio模型使用了Selector(选择器)和Channel(通道)的概念,允许线程可以监听多个通道的事件,并处理相应的事件。
以下是一个使用Java进行Nio模型编程的易懂示例:
java
public class NioServer {
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Server is running on port 8080...");
while (true) {
selector.select();
Set
Iterator
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isAcceptable()) {
ServerSocketChannel channel = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = channel.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int read = channel.read(buffer);
if (read > 0) {
buffer.flip();
String request = new String(buffer.array(), 0, read);
System.out.println("Server received: " + request);
buffer.clear();
}
}
keyIterator.remove();
}
}
}
}
### 三、Aio模型
Aio模型,即异步I/O模型,是Nio模型的进一步改进。在Aio模型中,线程可以异步地处理I/O请求,无需阻塞等待。这大大减成本时间了程序的性能和响应速度。
以下是一个使用Java进行Aio模型编程的易懂示例:
java
public class AioServer {
public static void main(String[] args) throws IOException {
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.accept(null, new CompletionHandler
@Override
public void completed(SocketChannel clientChannel, Void attachment) {
try {
clientChannel.configureBlocking(false);
clientChannel.read(ByteBuffer.allocate(1024), null, new CompletionHandler
@Override
public void completed(Integer result, Void attachment) {
ByteBuffer buffer = (ByteBuffer) attachment;
buffer.flip();
String request = new String(buffer.array(), 0, result);
System.out.println("Server received: " + request);