淘先锋技术网

首页 1 2 3 4 5 6 7

Java语言提供了两种不同的I/O模型,即BIO (Blocking I/O)和NIO (Non-Blocking I/O)。这两种模型都可以用于网络编程和文件系统操作。

BIO模型是一种阻塞式I/O,即当程序调用I/O操作时,程序会一直等待,直到读取到数据或者写入数据完成,才能继续执行。这种模型的优点是代码简单易懂,但是当有多个客户端连接时,每个客户端都需要一个线程来处理它的请求,这就占用了很多系统资源,当客户端数量增加时,系统的负载也会增加。

public class BIOServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new Handler(socket)).start();
}
}
}
public class Handler implements Runnable {
Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String request = reader.readLine();
writer.println("Hello, client!");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

NIO模型是一种非阻塞式I/O,即当程序调用I/O操作时,程序不会一直等待,而是可以继续执行后面的代码,在数据读取或者写入完成后,程序再去处理数据。这种模型的优点是可以使用一个线程处理多个客户端请求,从而减小系统的负载。但是NIO的代码比较复杂,需要使用Selector、Channel等类来进行操作。

public class NIOServer {
public static void main(String[] args) throws Exception {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set keys = selector.selectedKeys();
Iterator iterator = keys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.read(buffer);
buffer.flip();
socketChannel.write(buffer);
}
iterator.remove();
}
}
}
}

总的来说,BIO模型适合于客户端数量较少,每个请求需要长时间处理的场景,而NIO模型适合于客户端数量较多,每个请求仅需要短时间处理的场景。根据具体的场景需求,选择不同的I/O模型。