栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java的BIO,NIO,AIO

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java的BIO,NIO,AIO

BIO,NIO,AIO

本人小白,学习总结可能有错,发现错误请评论指出,后期修改


文章目录
  • BIO,NIO,AIO
  • 一、理解
  • 二、分类说明
    • 1、BIO
    • 2、AIO
      • 单线程模式(single Thread)
      • 多线程模式(reactor模式)
    • 3、AIO


一、理解

Java的BIO,NIO,AIO可以看作是java语言对操作系统各种IO模型的封装,

二、分类说明 1、BIO

阻塞IO,blocking阻塞。
当客户端每有一个访问service服务器,服务器就会创建一个线程来处理这个访问,有多少个访问就创建多少个线程。Blocking IO这个会发生阻塞的地方有很多,在服务器端,当没有客户端连接会阻塞,服务器的读和写都可能会发生阻塞
客户端代码

public class BIO_Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket();
        ss.bind("192.168.9.1", 8888);
        while(true){
            
            Socket s = ss.accept();
            new Thread(()->{
                handler(s);
            }).start();
        }
    }

    
    static void handler(Socket s){
        try{
            byte[] bytes = new byte[1024];
            int lent = s.getInputStream().read(bytes);
            System.out.println(new String(bytes,0,lent));

            s.getOutputStream().write(bytes,0,lent);
            s.getOutputStream().flush();
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}

客户端代码

public class BIO_Client {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.9.1",8888);
        s.getOutputStream().write("hello server".getBytes());
        s.getOutputStream().flush();

        System.out.println("write over,waiting for msg back...");
        byte[] bytes = new byte[1024];
        int len = s.getInputStream().read(bytes);
        System.out.println(new String(bytes,0,len));
        s.close();
    }
}

BIO模型的缺点:当大量客户端链接的时候,效率太低
代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context
2、AIO

非阻塞IO

单线程模式(single Thread)

在单线程模型下,在客户端和服务器之间有一个选择器(selector),这个选择器的作用如下:
1、每隔一段时间,selector会轮询(监控)一遍服务器,查看是否有客户端要链接服务器,
2、监控已经建立好的连接,查看哪些连接需要写,需要读。
3、当发现需要读和写,或者连接的请求,就立刻处理。

这些监控的事件处理没有顺序。
1、选择器会在服务器的每个接口上添加一个key,用于监控客户端是否有连接的请求
2、当一个客户端连接成功后,会在连接通道上注册读写事件的监控。

多线程模式(reactor模式)

在这个模型下,增加了一个线程池,这个线程池的作用是专门处理客户端读写请求。
流程:
1、selector依然会注册对服务器的监听器,用于监听是否有客户端连接请求,然后只处理这类请求
2、当客户端连接成功后,有读写请求(非accept())的时候,select会将这些请i求交给一个线程池的空闲线程来处理。

3、AIO

不需要轮询,并且selector可以有多个。
流程如下:
1、当有客户端请求连接的是后,操作系统贤进行连接,然后通知selector,是否连接成功由selector决定。
2、连接成功的后的读写等请求,依然是交给线程池里边的空闲线程来处理。

学习的视频连接


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号