Netty - I/O模型之BIO

简介: Netty - I/O模型之BIO

20210116191555656.png


I/O模型的定义

什么是I/O模型呢? 简单来说就是说用什么样的通道进行数据的发送和接收。

在Java中,共支持3种网络编程IO模式:BIO,NIO,AIO


BIO

Demo Server

package com.artisan.iomodel.bio;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2021/1/16 22:23
 * @mark: show me the code , change the world
 */
public class SocketServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(7777);
        while (true) {
            System.out.println("等待client连接....");
            //阻塞方法
            Socket clientSocket = serverSocket.accept();
            System.out.println("已收到客户端的连接....,开始处理");
            handler(clientSocket);
            /*new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        handler(clientSocket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();*/
        }
    }
    private static void handler(Socket clientSocket) throws IOException {
        byte[] bytes = new byte[1024];
        System.out.println("准备读取客户端发送来的数据");
        //接收客户端的数据,阻塞方法,没有数据可读时就阻塞
        int read = clientSocket.getInputStream().read(bytes);
        System.out.println("读取ing");
        if (read != -1) {
            System.out.println("接收到客户端的数据:" + new String(bytes, 0, read));
        }
        // 向服务端发送数据
        clientSocket.getOutputStream().write("HelloClient".getBytes());
        // 缓冲区刷新
        clientSocket.getOutputStream().flush();
    }
}

Demo Client

package com.artisan.iomodel.bio;
import java.io.IOException;
import java.net.Socket;
/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2021/1/16 22:27
 * @mark: show me the code , change the world
 */
public class SocketClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 7777);
        //向服务端发送数据
        socket.getOutputStream().write("HelloServer".getBytes());
        socket.getOutputStream().flush();
        System.out.println("向服务端发送数据结束");
        byte[] bytes = new byte[1024];
        //接收服务端回传的数据
        socket.getInputStream().read(bytes);
        System.out.println("接收到服务端的数据:" + new String(bytes));
        socket.close();
    }
}


Demo Run

启动 Server,

20210116225559225.png


然后启动Client

20210116230432656.png


同时看下Server的数据

20210116230521279.png

我们用cmd工具来连一下 , telnet 127.0.0.1 7777

20210116230629533.png


回车,输入 ctrl + ]


20210116230719658.png

作为客户端发送消息


20210116230755455.png

查看server是否收到

20210116230830873.png


BIO 同步阻塞模型


通过上面的例子,可以看到 一个客户端连接对应一个处理线程

上面的线程模型 可以看到 只有一个main线程在处理,如果当前main线程没有处理完,后,后面的请求是无法被处理的 。


20210117094929526.png


当然了我们上面的是一个线程的, 也可以改造为多线程 。

new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        handler(clientSocket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();



就变成了下面这种模式


20210116232050230.png


小结


缺点显而易见

  • read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源
  • 每个请求都需要开辟一个线程去处理,开辟过多的线程势必会导致服务器资源紧张。

BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 但程序简单易理解。

相关文章
|
6月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
6月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
127 1
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
160 0
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
183 1
|
消息中间件 监控 Java
滴滴面试:谈谈你对Netty线程模型的理解?
Netty 线程模型是指 Netty 框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。 **Netty 线程模型被称为 Reactor(响应式)模型/模式,它是基于 NIO 多路复用模型的一种升级,它的核心思想是将 IO 事件和业务处理进行分离,使用一个或多个线程来执行任务的一种机制。** ## 1.**Reactor三大组件** Reactor 包含以下三大组件: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1717079218890-89000a00-48bc-4a1a-b87e-e1b6
199 2
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
缓存 网络协议 前端开发
从BIO到NIO在到Netty线程模型详解
从BIO到NIO在到Netty线程模型详解
279 1