BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程
BIO(Blocking I/O,同步阻塞I/O)模型:是JDK1.4之前的标准,它是一个连接一个线程的模型。即每个Socket连接对应一个线程,在该连接没有结束之前,线程不能去处理其他连接。
NIO(Non-blocking I/O,同步非阻塞I/O)模型:是JDK1.4引入的,目的是替代传统的BIO模式,提供更好的I/O操作能力。它是一个请求一个线程的模型,一个线程可以处理多个连接的I/O请求。
IO多路复用模型:是一种同步非阻塞的I/O模型,它可以同时监视多个文件描述符(socket连接)的读写状况,当其中任意一个socket的数据准备好后,就处理该socket的读写请求。
Java NIO的核心组件包括:Channel(通道)、Buffer(缓冲区)、Selector(选择器)。
以下是使用Java NIO进行网络编程的简单示例:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NIOServer {
public void start(int port) throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(port));
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
final ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
while (true) {
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
if (key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel socketChannel = ssc.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel socketChannel = (SocketChannel) key.channel();
byteBuffer.clear();
while (socketChannel.read(byteBuffer) > 0) {
byteBuffer.flip();
System.out.println(new String(byteBuffer.array(), 0, byteBuf
评论已关闭