深度长文:从Bio到Nio到Aio,再到响应式编程

原创
ithorizon 7个月前 (10-13) 阅读数 19 #Linux

从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 keys = selector.selectedKeys();

Iterator keyIterator = keys.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);


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Linux


热门