L4:NIO模型与Netty入门

本文深入探讨了Java Socket编程,包括单线程、多线程以及线程池处理HTTP服务器的方式,并分析了不同处理模型的效率。接着,文章介绍了IO模型,如阻塞与非阻塞IO、IO多路复用(select、poll、epoll)以及异步IO。此外,还讲解了Netty框架,强调其异步、事件驱动的特性,适合高性能的协议服务器。Netty的基本概念,如Event与Handler,以及入站、出站事件也被提及。
摘要由CSDN通过智能技术生成
【目录】
1.Java Socket编程*:如何基于Socket 实现 Server
2.深入讨论IO*: Server 处理时到底发生了什么
3.IO模型与相关概念*:怎么理解 NIO
4.Netty框架简介:什么是Netty
5.Netty使用示例*:如何使用Netty实现NIO
6.总结

1.Java Socket编程

IP:标识主机唯一性
端口:标识主机上对应的不同进程 or 服务
在这里插入图片描述

Java实现一个最简单的HTTP服务器(三种方式)

// 单线程处理socket
public class SocketHttpDemo {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8081);
        while (true) {
            Socket socket = serverSocket.accept();
            service(socket);
        }
    }

    private static void service(Socket socket) {
        try {
            Thread.sleep(20);
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("HTTP/1.0 200 ok");
            printWriter.println("Content-type:text/html;charset=utf-8");
            printWriter.println();
            printWriter.println("hello nio");
            printWriter.close();
            socket.close();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 每个请求一个线程
public class SocketHttpDemo {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8081);
        while (true) {
            Socket socket = serverSocket.accept();
            
            new Thread(() -> {
                    service(socket);
            }).start();
           
        }
    }

    private static void service(Socket socket) {
        try {
            Thread.sleep(20);
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("HTTP/1.0 200 ok");
            printWriter.println("Content-type:text/html;charset=utf-8");
            printWriter.println();
            printWriter.println("hello nio");
            printWriter.close();
            socket.close();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 固定大小的线程池处理
public class SocketHttpDemo {

    public static void main(String[] args) throws IOException {
        ExecutorService executorService = Executors.newFixedThreadPool(40);
        ServerSocket serverSocket = new ServerSocket(8081);
        while (true) {
            Socket socket = serverSocket.accept();
            executorService.execute(()->{
                service(socket);
            });
        }
    }

    private static void service(Socket socket) {
        try {
            Thread.sleep(20);
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("HTTP/1.0 200 ok");
            printWriter.println("Content-type:text/html;charset=utf-8");
            printWriter.println();
            printWriter.println("hello nio");
            printWriter.close();
            socket.close();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

压测环境可观察三种情况下执行效率
在这里插入图片描述

2.深入讨论IO*: Server 处理时到底发生了什么

服务分类有CPU密集型(计算/业务操作)和IO密集型(IO操作与等待/网络,磁盘,数据库等)
使用多线程可以提升CPU执行效率,过多则会导致频繁上下文切换花销变大,得不偿失,要合理分配线程大小
在这里插入图片描述

3.IO模型与相关概念

同步 / 异步(回调函数) 是通信模式
阻塞 / 非阻塞 是线程处理模式
在这里插入图片描述

①阻塞式IO - BIO

最常见,按顺序执行同时等待程序按步骤执行的过程
在这里插入图片描述

②非阻塞IO

与阻塞IO类比,内核会立即返回做其他事;
用户进程第一阶段并不阻塞,会不断主动询问kernel数据是否准备好;第二个阶段依旧是阻塞的,要等数据执行;
在这里插入图片描述

③IO多路复用 - 事件驱动IO

思想:先全部接收请求,内部再进行服务的执行(将接收请求和服务分离)
单线程中同时监控多个套接字,通过select或poll轮询所负责的所有socket,当某个socket有数据到达,通知用户进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
select - 数组
poll - 链表
epoll - 红黑树

④epoll Reactor模型

在这里插入图片描述

⑤信号驱动IO

消息队列的最早的原型
在这里插入图片描述

线程池 -> EDA(事件驱动架构) -> SEDA(分阶段事件驱动架构)

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

⑥异步IO

IO全流程的非阻塞;用户进程发出系统调用后立即返回,内核等待数据准备完成,之后将数据拷贝至用户进程缓冲区,之后发送信号告诉用户进程IO操作执行完毕(回调过程)
在这里插入图片描述
各个环境支持异步IO时间:
在这里插入图片描述

4.Netty

特点:

  • 异步
  • 事件驱动
  • 基于NIO
    适用于 服务端、客户端、TCP/UDP

高性能的协议服务器:

  • 高吞吐
  • 低延迟
  • 低开销
  • 零拷贝
  • 可扩容
  • 松耦合:网络和业务逻辑分离
  • 使用方便,可维护性好
    在这里插入图片描述
    基本概念:
    在这里插入图片描述

Event & Handler

入站事件:

  • 通道激活和停用
  • 读操作事件
  • 异常事件
  • 用户事件

出站事件:

  • 打开连接
  • 关闭连接
  • 写入连接
  • 刷新数据

Netty 应用组成:

  • 网络事件
  • 应用程序逻辑事件
  • 事件处理程序

5.NIO程序

管道 + 过滤器 实现网关demo

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wimb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值