详解Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

针对这个话题,我将分几个部分进行详细讲解。

1. 了解Java 网络IO编程

1.1 BIO

BIO即Blocking IO,同步阻塞IO,应用方面比较广泛,缺点是每个客户端连接时都需要创建一个线程,因此比较消耗系统资源,如果客户端连接数比较少,建议使用BIO。

1.2 NIO

NIO即Non-blocking IO,同步非阻塞IO,优点是可以支持多路复用,一个线程可以处理多个客户端连接,缺点是编程复杂,需要熟练掌握Selector、Channel、Buffer等概念。

1.3 AIO

AIO即Asynchronous IO,异步非阻塞IO,通常由操作系统来完成数据传输,Java 7后提供了NIO 2.0,支持异步IO,相较NIO来说,AIO更加简单易用。

2. 示例代码说明

下面我会通过两个具体的示例来说明BIO、NIO、AIO的使用。

2.1 BIO 示例

BIO使用中每个客户端连接时都需要创建一个线程,因此比较消耗系统资源。下面是一个BIO示例代码:

public class BIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server start at:8888");
        while(true){
            Socket socket = serverSocket.accept();
            Handler handler = new Handler(socket);
            new Thread(handler).start();
        }
    }

    static class Handler implements Runnable{
        Socket socket;
        public Handler(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            InputStream inputStream = null;
            try {
                inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(bytes)) != -1){
                    sb.append(new String(bytes,0,len,"UTF-8"));
                }
                System.out.println("Server receive message:" + sb);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(inputStream != null){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

2.2 NIO 示例

NIO使用中可以一个线程处理多个客户端连接,相较BIO来说,可以更加节省系统资源。下面是一个NIO示例代码:

public class NIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.bind(new InetSocketAddress(8888));

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            int readyChannels = selector.select();
            if (readyChannels == 0) continue;
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectionKeys.iterator();
            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();
                if (key.isAcceptable()) {
                    ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
                    SocketChannel channel = serverChannel.accept();
                    channel.configureBlocking(false);
                    channel.register(selector, SelectionKey.OP_READ);
                    System.out.println("客户端连接成功,IP地址为:" + channel.getRemoteAddress());
                } else if (key.isReadable()) {
                    SocketChannel channel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int read = channel.read(buffer);
                    if (read > 0) {
                        buffer.flip();
                        byte[] bytes = new byte[buffer.remaining()];
                        buffer.get(bytes);
                        String message = new String(bytes, "UTF-8");
                        System.out.println("Server receive message:" + message);
                    } else if (read < 0) {
                        key.cancel();
                        channel.close();
                    }
                }
                keyIterator.remove();
            }
        }
    }
}

2.3 AIO 示例

AIO使用中相较NIO来说更加简单易用,Java 7以后提供了NIO 2.0支持异步IO。下面是一个AIO示例代码:

public class AIOEchoServer {
    private AsynchronousServerSocketChannel serverSocketChannel;

    public AIOEchoServer(int port) throws Exception {
        serverSocketChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(port));
    }

    public void start() {
        serverSocketChannel.accept(this, new CompletionHandler<AsynchronousSocketChannel, AIOEchoServer>() {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            @Override
            public void completed(AsynchronousSocketChannel channel, AIOEchoServer attachment) {
                buffer.clear();
                baos.reset();
                try {
                    channel.read(buffer).get();
                    buffer.flip();
                    baos.write(buffer.array(), 0, buffer.remaining());
                    String message = new String(baos.toByteArray(), "UTF-8");
                    System.out.println("Server receive message:" + message);
                    buffer.clear();
                    channel.write(ByteBuffer.wrap(("Echo:" + message).getBytes("UTF-8"))).get();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void failed(Throwable exc, AIOEchoServer attachment) {
                exc.printStackTrace();
            }
        });
        System.out.println("Server start at:8888");
    }

    public static void main(String[] args) throws Exception {
        new AIOEchoServer(8888).start();
        Thread.sleep(100000);
    }
}

在这里,通过以上三个示例,可以很好地了解BIO、NIO、AIO这三种不同网络IO编程模型的使用方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • JSP一句话木马代码

    首先,需要注意的是,编写和传播木马代码是违法的,本文仅用于学习和研究用途。 JSP一句话木马是一种常见的web后门,可以通过在服务器上运行的JSP文件中注入一段恶意代码的方式,让攻击者可以远程控制服务器,获取敏感信息等。以下是攻击过程的详细说明: 扫描漏洞:攻击者扫描要攻击的目标服务器,尤其是针对常见的web应用程序,如JavaWeb开发中常用的Tomcat…

    Java 2023年6月15日
    00
  • Spring零基础到进阶之鸿蒙开篇

    Spring零基础到进阶之鸿蒙开篇 一、学习前准备 理解Java基础语法,掌握面向对象编程思想。 了解MVC模式和IoC容器的原理。 确保已安装好JDK与Eclipse/IntelliJ IDEA等IDE。 下载安装Spring Framework。 二、Spring入门 1. 下载Spring Framework 可通过Git进行下载:git clone …

    Java 2023年5月19日
    00
  • Java实现一个达达租车系统的步骤详解

    Java实现一个达达租车系统的步骤详解 第一步:需求分析和规划 在开始开发代码之前,必须先了解项目的需求和规划。在分析需求方面,需要考虑以下几点: 使用者和管理者的系统需求。 如何处理订单和租车。 如何计算租车费用。 如何处理支付和退款。 在规划方面,应该思考以下几点: 创建和管理车辆库存。 创建和管理订单。 创建和管理支付系统。 创建和管理价格计算方法。 …

    Java 2023年5月19日
    00
  • Java异常链是什么?

    Java异常链是指一个异常抛出并被上层方法捕获时,将该异常重新封装成新的异常并抛出,形成的异常处理机制。 当一个方法抛出异常时,其上层调用该方法的方法也可能抛出异常。如果每个方法都将异常立即抛出,则可能会导致错误信息繁琐。这时就需要将底层异常信息传递到上层调用,形成异常链,以便更好地追踪错误信息。强调的是,异常链并不会将异常的控制权交给上层调用,而是由异常处…

    Java 2023年4月27日
    00
  • 半小时实现Java手撸网络爬虫框架(附完整源码)

    作为一名网站的作者,我理解你对于半小时写一个网络爬虫框架的需求。这里给出详细攻略: 步骤一:准备工作 在开始编写爬虫框架之前,需要准备好以下工具:1. 开发环境:JDK、IDEA(或其他你喜欢的IDE)2. 技术框架:Jsoup、HttpClient 步骤二:建立基础框架 新建Java项目,创建类WebCrawler。 在WebCrawler类中添加以下变量…

    Java 2023年5月18日
    00
  • Java读取并下载网络文件的方法

    以下是详细的“Java读取并下载网络文件的方法”的攻略: 1. 使用Java标准库中的URL和URLConnection类实现 1.1 代码示例 import java.io.InputStream; import java.io.FileOutputStream; import java.net.URL; import java.net.URLConnec…

    Java 2023年5月20日
    00
  • jar包手动添加到本地maven仓库的步骤详解

    这里将为您详细讲解手动将Jar包添加到本地Maven仓库的完整攻略。 1.准备工作: 在执行手动添加Jar包到Maven仓库之前,您需要准备以下工作: 将需要添加的Jar包下载到本地,或者确保本地已经存在该Jar包。 配置好Maven的环境变量。 获取该Jar包的版本号以及groupId和artifactId等相关信息。 2.手动添加Jar包到Maven仓库…

    Java 2023年5月20日
    00
  • Spring常用注解及http数据转换教程

    下面就为大家详细讲解“Spring常用注解及http数据转换教程”的完整攻略。 一、Spring常用注解 在Spring框架中,注解是一项非常重要的功能,在实际开发中,开发者经常会使用到Spring框架中的注解。下面列出Spring中常用的注解及其使用方法: 1. @Autowired @Autowired注解为Spring中的自动装配注解,作用是自动装配被…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部