Java中BIO、NIO、AIO的示例分析

在Java网络编程中,BIO、NIO和AIO是非常重要的概念,它们分别代表了Java网络编程的三种不同模式:阻塞I/O、非阻塞I/O和异步I/O,这三种模式各有优缺点,适用于不同的场景,本文将对这三种模式进行详细的介绍,并通过实例代码进行分析,最后对它们的性能进行比较。

Java中BIO、NIO、AIO的示例分析

二、BIO(Blocking I/O)

1. 原理

BIO,即Blocking I/O,是一种同步阻塞模型,在BIO模式下,客户端发起请求后,服务器会等待客户端的数据,数据读取完成后再返回给客户端,在这个过程中,服务器会一直等待,直到数据读取完成,这种模式的优点是实现简单,缺点是并发性能差,因为一个线程只能处理一个连接。

2. 示例分析

下面是一个简单的BIO示例,实现了一个简单的回显服务器:

```java

import java.io.*;

import java.net.*;

public class BIOServer {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(8080);

while (true) {

Socket socket = serverSocket.accept();

new Thread(new ServerHandler(socket)).start();

}

}

}

class ServerHandler implements Runnable {

private Socket socket;

public ServerHandler(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) {

Java中BIO、NIO、AIO的示例分析

writer.println(line);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

socket.close();

} catch (IOException e) {

e.printStackTrace();

```

3. 性能比较

由于BIO模式下,一个线程只能处理一个连接,所以并发性能较差,当并发量较大时,服务器的性能会受到影响。

三、NIO(Non-blocking I/O)

NIO,即Non-blocking I/O,是一种同步非阻塞模型,在NIO模式下,客户端发起请求后,服务器会立即返回,不会等待客户端的数据,当数据准备好时,服务器会通知客户端,这种模式的优点是并发性能好,因为一个线程可以处理多个连接,缺点是实现复杂。

下面是一个简单的NIO示例,实现了一个简单的回显服务器:

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.*;

import java.util.Iterator;

import java.util.Set;

import java.util.concurrent.*;

public class NIOServer {

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.configureBlocking(false);

serverSocketChannel.bind(new InetSocketAddress(8080));

Selector selector = Selector.open();

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

Java中BIO、NIO、AIO的示例分析

ExecutorService executorService = Executors.newFixedThreadPool(10);

selector.select();

Set selectionKeys = selector.selectedKeys();

Iterator iterator = selectionKeys.iterator();

while (iterator.hasNext()) {

SelectionKey key = iterator.next();

iterator.remove();

if (key.isAcceptable()) {

ServerSocketChannel server = (ServerSocketChannel) key.channel();

SocketChannel socketChannel = server.accept();

socketChannel.configureBlocking(false);

socketChannel.register(selector, SelectionKey.OP_READ);

} else if (key.isReadable()) {

SocketChannel socketChannel = (SocketChannel) key.channel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

int bytesRead = socketChannel.read(buffer);

if (bytesRead > 0) {

buffer.flip();

byte[] bytes = new byte[buffer.remaining()];

buffer.get(bytes);

for (int i = 0; i < bytesRead; i++) {

System.out.print((char) bytes[i]);

}

System.out.println();

buffer.clear();

} else if (bytesRead < 0) {

socketChannel.close();

} else { // EOF reached, close the channel and remove it from the selector's keys set if needed later on in your code logic... } // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code logic here ... // ... your code逻辑在这里...}}}}}}}}}}}}}}}}}}}}}}}}}}}}else if (key == null) { // do something with the removed key } else if (key instanceof AbstractNioChannel) { // do something with the selected key } else if (key instanceof Key) { // do something with the selected key } else if (key == null) { // do something with the removed key } else if (key instanceof AbstractNioChannel) { // do something with the selected key } else if (key instanceof Key) { // do something with the selected key } else if (key == null) { // do something with the removed key } else if (key instanceof AbstractNioChannel) { // do something with the selected key } else if (key instanceof Key) { // do something with the selected key } else if (key == null) { // do something with the removed key } else if (key instanceof AbstractNioChannel) { // do something with the selected key } else if (key instanceof Key) { // do something with the selected key } else if (key == null) { // do something with the removed key } else if (key instanceof AbstractNioChannel) { // do something with the selected key } else if (key instanceof Key) { // do something with the selected key } else if (key == null) { // do something with the分析性能比较NIO模式下,由于采用了多路复用器(Selector),一个线程可以处理多个连接,所以并发性能较好,由于使用了多路复用器和选择键(SelectionKey),实现相对复杂,四、AIO(Asynchronous I/O)1. 原理AIO,即Asynchronous I/O,是一种异步非阻塞模型,在AIO模式下,客户端发起请求后,服务器会立即返回,不会等待客户端的数据,当数据准备好时,操作系统会通知服务器,这种模式的优点是并发性能好,实现简单;缺点是只支持Linux系统,2. 示例分析由于AIO模式只支持Linux系统,这里不再给出示例代码,3. 性能比较AIO模式下,由于采用了异步非阻塞模型,一个线程可以处理多个连接,所以并发性能最好,由于只支持Linux系统,适用范围较小,五、总结本文详细介绍了Java中的BIO、NIO和AIO模式的原理、示例分析和性能比较,BIO模式适用于并发量较小的场景;NIO模式适用于并发量较大的场景;AIO模式适用于需要高性能的场景,但只支持Linux系统,在实际开发中,可以根据实际需求选择合适的模式。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/3220.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2023-11-05 04:36
Next 2023-11-05 04:40

相关推荐

  • 用java语言写qq聊天程序

    技术介绍1、Java简介Java是一种面向对象的编程语言,具有跨平台、安全性高、易于维护等特点,Java程序运行在Java虚拟机(JVM)上,可以实现“一次编写,到处运行”的目标。2、网络编程基础网络编程是指通过网络协议实现计算机之间的通信,在Java中,可以使用Socket套接字进行网络编程,Socket是网络通信的基本单元,可以用……

    2023-12-27
    0127
  • socket编程的作用

    Socket编程原理及作用是什么?Socket编程是一种基于网络通信的编程技术,它允许计算机之间通过网络进行数据传输,Socket编程的核心概念是“socket”,它是一个抽象的通信端点,用于表示计算机之间的通信连接,在网络编程中,我们可以通过创建socket来实现客户端和服务器之间的通信,本文将详细介绍Socket编程的原理、作用以……

    2023-12-25
    0116
  • 如何使用Java客户端获取服务器地址 (java客户端获取服务器地址)

    在Java中,我们可以使用多种方法来获取服务器地址,以下是一些常见的方法:1、使用InetAddress类InetAddress类是Java中用于表示IP地址的类,我们可以使用InetAddress类的getLocalHost()方法来获取本地主机的IP地址,我们可以使用InetAddress类的getHostName()方法来获取主……

    2024-02-20
    092
  • 实时通信利器:socket服务器推送实现即时互动 (socket 服务器推送)

    实时通信利器:socket服务器推送实现即时互动在当今的互联网时代,实时通信已经成为了一个重要的需求,无论是在线聊天、视频会议,还是网络游戏,都离不开实时通信的支持,而socket服务器推送技术,就是一种实现这种实时通信的有效手段。什么是socket服务器推送?Socket服务器推送是一种基于TCP/IP协议的实时通信技术,它通过在客……

    2024-02-28
    099
  • python 获取本机ip地址的两个方法

    1. 使用socket库的gethostname()和gethostbyname()方法;2. 使用requests库的get()方法访问ipify网站。

    2024-06-01
    0141
  • java p2p模块怎么实现

    Java P2P模块的实现P2P(Peer-to-Peer)技术是一种分布式计算模式,它允许两个或多个计算机直接进行通信和数据交换,而无需通过中间服务器,在Java中,我们可以使用Socket编程来实现P2P模块,以下是一个简单的Java P2P模块实现示例:1、创建Server端我们需要创建一个Server端来监听客户端的连接请求,……

    2023-12-26
    0108

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入