JAVA中IO通信模型(BIO、NIO、AIO)

BIO

Blocking IO也称为BIO,即同步阻塞IO。Java的io包下提供的InputStream和OutputStream操作,交互⽅式是同步且阻塞的⽅式,在输⼊输出流的操作进⾏读、写动作完成之前,线程会⼀直阻塞。因此io包中对流的操作容易造成性能的瓶颈。

服务端网络BIO模型

在BIO同步阻塞模型下,服务端收到客户端请求后,如果二者之间未发生数据传输,那么线程会一直处于阻塞状态,其他请求就无法处理

单线程网络BIO模型

在这里插入图片描述
服务端代码:

public class SingleServerScoket {
    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true){
            //accept()方法是一个阻塞方法,监听8888端口,如果有客户端请求8888端口才会继续往下执行,等待客户端连接
            Socket socket = serverSocket.accept();

            InputStream inputStream = socket.getInputStream();

            OutputStream outputStream = socket.getOutputStream();

            byte[] bytes = new byte[1024];

            //read()方法是一个阻塞方法,只有读取到数据才会继续往下执行,阻塞等待客户端发送数据
            int len = inputStream.read(bytes);

            System.out.println(new String(bytes,0,len));

            outputStream.write("success".getBytes());

            outputStream.flush();

            inputStream.close();

            outputStream.close();

        }

    }
}

客户端代码:

public class ClientOne {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("localhost", 8888);

        OutputStream outputStream = socket.getOutputStream();

        InputStream inputStream = socket.getInputStream();

        outputStream.write("Hello Wrold".getBytes());
        
        outputStream.flush();

        byte[] bytes = new byte[1024];

        int len = inputStream.read(bytes);

        System.out.println(new String(bytes,0,len));
        
        socket.close();
    }
}
多线程网络BIO模型

在这里插入图片描述
多线程服务端代码:

public class MultiServerSocket {
    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true){
            //accept()方法是一个阻塞方法,监听8888端口,如果有客户端请求8888端口才会继续往下执行,等待客户端连接
            Socket socket = serverSocket.accept();

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        InputStream inputStream = socket.getInputStream();

                        OutputStream outputStream = socket.getOutputStream();

                        byte[] bytes = new byte[1024];

                        //read()方法是一个阻塞方法,只有读取到数据才会继续往下执行,阻塞等待客户端发送数据
                        int len = inputStream.read(bytes);

                        System.out.println(new String(bytes,0,len));

                        outputStream.write("success".getBytes());

                        outputStream.flush();

                        inputStream.close();

                        outputStream.close();

                    }catch (Exception e){

                    }

                }
            });

        }

    }
}

NIO

NIO(Non Blocking IO)是同步⾮阻塞的IO,服务器可以使⽤⼀个线程来处理多个客户端请求,客户端发送的请求会注册到多路复⽤器Selector上,由多路复⽤器Selector轮询各客户端的请求并进⾏处理。与BIO网络模型最大的区别就是:NIO将传统BIO的那一套阻塞流程拆分为事件的方式,通过Selector轮询每个通道上是否有事件发生,完成请求处理,其中重要的几大组件分别是:ServerSocketChannel、Selector、SocketChannel、SelectionKey、Buffer

FileChannel

1、缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。根据数据类型不同(boolean除外),提供了相应类型的缓冲区:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。

上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区。

filp():随着数据的写入position(位置)也在不断的发生变化,filp其实就是让position从0开始,到limt结束
在这里插入图片描述

ServeSocketChannel

SocketChannel

DataGrame

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值