文章目录

  • I . Netty 简介
  • II . Netty 应用场景
  • III . Java I/O 模型
  • IV . BIO 概念
  • V . BIO 开发流程
  • VI . BIO 实例
  • VII . BIO 模型实例分析

I . Netty 简介


1 . Netty 是网络开发框架 , 其有如下特点 ;

① 异步 : 与同步相对 , 操作之间 不产生阻塞 , 发出请求后可以不等待回应 , 继续执行后面的代码逻辑 ;

② 事件驱动 : 任何操作 , 都需要一个触发事件 , 如按钮点击 , 回调操作等 ;

2 . Netty 作用 :

① 用途 : 开发 高并发 的 网络 IO 程序 , 其性能 与 可靠性都很高 ;

② 服务器程序 : Netty 网络应用部署在服务器中 , 主要是与客户端进行高并发交互 ;

③ 点对点 ( P2P ) 程序 : 点对点数据传输 ;

3 . Netty 层次 : Netty 最底层是基于 TCP/IP 协议 , 然后封装了原生的网络编程及并发编程 , 在之上使用了 NIO 进行进一步封装 , 最上层才是 Netty 提供的服务 ;

① 底层协议 : TCP 协议 ;

② 原生 API 封装 : 该框架对原生的网络编程及并发操作进行了封装和优化 ;

③ 本质 : Netty 的本质是在 Java NIO 基础上封装的框架 , 适合开发网络服务器 , 如游戏服务器等 ;

II . Netty 应用场景


1 . 远程过程调用 ( RPC ) 框架 : 分布式系统中的远程过程调用框架 , 看重 Netty 的 高并发 , 高性能 的能力 , 将其作为分布式远程调用的网络通信组件 ; 这些框架的底层都是使用 Netty 实现的 ;

2 . 游戏服务器 : 手游 / 大型网游 等后台服务器基本都是基于 Netty 开发 , Netty 作为服务器 高性能 高并发 的通信模块 , 提供了 TCP / UDP / HTTP 协议通信底层功能 , 在这个基础上开发交互的业务逻辑 ;

III . Java I/O 模型


1 . Java IO 模型 : 收发数据的通道模式 , 工作模式 是 同步 还是 异步 , 等待机制是 阻塞 还是 非阻塞 ;

① IO 模型分类 : 根据上述特点可将 Java 中的网络 IO 模型分为 BIO , NIO , AIO , 333 类 ;

② 三种模型性能对比 : 三种模型性能依次从低到高排列为 BIO <<< NIO <<< AIO ;

2 . BIO 模型 : 同步阻塞模型 , 在服务器端 , 针对每个客户端的连接请求 , 都要启动一个线程处理相关的业务逻辑 ;

① 适用场景 : 连接数 少 ;

② 最小 JDK 支持版本 : 1.4 ;

③ 弊端 : 对服务器资源占用高 , 如果客户端只是连接 , 不做任何操作 , 那么也占用了服务器的资源 ;

④ 优点 : 程序简单 , 容易理解 ;

⑤ 瓶颈 : 传统的 BIO 处理大并发数据量时 , 有瓶颈 ;

⑥ BIO 模型中 客户端 与 服务器端 交互 图示 : 服务器端的线程数 与 客户端一样 ;

上图中 , 如果有 1 万个客户端 , 那么对应的服务器端就会有 1 万个线程 ;

3 . NIO 模型 : 同步非阻塞模型 , 在服务器端 , 一个线程处理多个客户端连接 , 客户端连接服务器时 , 会在多路复用器上注册 , 多路复用器会一直轮训是否有连接请求 , 如果有就处理 , 如果没有不做任何操作 ;

① 适用场景 : 连接数 多 , 都是短连接 ; 如 : 聊天室 , 游戏服务器 等 ;

② 最小 JDK 支持版本 : 1.4 ;

③ 多路复用器 Selector : 可以理解成一个选择器 ;

④ NIO 实现基础 : 客户端与服务器端不是时刻都在进行数据交互 , 而是间歇性的 , 大部分时间都是出于静默 ( 非活动 ) 状态 ;

⑤ NIO 模型中 客户端 与 服务器端 交互 图示 : 服务器端启动一个线程 , 线程中维护 Selector 选择器 , 该选择器会维护多个通道 , 当某个通道有事件发生 , 即客户端有请求进来 , 那么处理该事件 ;

4 . AIO 模型 : 异步非阻塞模型 , 引入异步通道概念 , 并调用操作系统参与并发任务 ;

① 适用场景 : 连接 的个数多 , 并且都是 长连接 ;

② 最小 JDK 支持版本 : 1.7 ;

③ 工作流程 : 先判定客户端请求的有效性 , 有效请求才启动线程 ;

④ 当前状态 : NIO 的进阶版 , 该技术是 JDK 1.7 引入 , 目前应用不是很广 ; Netty 是基于 NIO 模型的 ;

IV . BIO 概念


BIO 简介 : Blocking IO , 阻塞 IO , 传统 Java IO 编程 ;

① 特点 : 同步阻塞 ;

② 连接 对应 线程 : 服务器端 每维护 一个连接 , 都要启动一个相应的线程 ; 这样就会造成性能浪费 ;

③ BIO 改进方案 : 使用线程池机制改进 BIO , 每个线程可以处理客户端连接 ;

④ NIO 基础 : BIO 是 NIO 的基础 ;

V . BIO 开发流程


1 . 连接流程 : 以 TCP 连接为例 ;

① 服务器端 监听 : 服务器端创建 ServerSocket , 监听接口 ;

② 客户端 连接 : 创建 Socket , 向服务器端申请连接 ;

③ 服务器端 线程 : 接受客户端连接 , 创建一个线程 , 专门与该客户端进行通信 ;

2 . 交互过程 :

① 客户端请求 : 客户端通过建立的连接 , 向服务器端发送请求 , 服务器端如果有线程响应该请求 , 那么处理该请求 , 如果没有线程响应 , 那么等待 , 之后进行超时处理 ;

② 服务器端响应 : 服务器端响应了客户端请求 , 客户端在请求返回后 , 继续执行后面的代码逻辑 ;

VI . BIO 实例


1 . BIO 示例 :

① 服务器端 : 编写服务器端 , 监听 8888 端口 , 阻塞等待客户端连接 , 连接成功后 , 创建线程 , 线程中阻塞等待客户端发送请求数据 ;

② 客户端 : 编写一个客户端 , 请求服务器的 8888 端口号 , 客户端发送 “Hello World” 字符串给服务器端 ;

③ Telnet 客户端 : 使用 Telnet 客户端向上述服务器端 8888 端口 发送 “Hello World” 字符串请求 ;

2 . 服务器代码示例 :

package kim.hsl.bio;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TCPServer {public static void main(String[] args) {try {//创建线程池ExecutorService threadPool = Executors.newCachedThreadPool();//创建服务器套接字ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务器启动,监听 8888 端口");while (true){//阻塞, 等待客户端连接请求 ( 此处是第一个阻塞点 )Socket socket = serverSocket.accept();System.out.println("客户端连接成功");//线程池启动线程threadPool.execute(new ClientRquest(socket));}} catch (IOException e) {e.printStackTrace();}}/*** 与客户端交互类*/static class ClientRquest implements Runnable {private Socket socket;public ClientRquest(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {clientRequest();} catch (IOException e) {e.printStackTrace();} finally {//最终要将 Socket 关闭, 如果出异常继续捕获try {socket.close();} catch (IOException e) {e.printStackTrace();}}}public void clientRequest() throws IOException {//获取输入流, 读取客户端写入的信息byte[] buffer = new byte[1024];InputStream is = socket.getInputStream();System.out.println("等到客户端请求");//此处会阻塞等待客户端的请求 ( 此处是第二个阻塞点 )int count = is.read(buffer);String request = new String(buffer, 0, count);System.out.println("客户端请求到达 : " + request);}}
}

3 . 客户端代码示例 :

package kim.hsl.bio;import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;public class TCPClient {public static void main(String[] args) {try {Socket socket = new Socket();InetSocketAddress inetSocketAddress =new InetSocketAddress(Inet4Address.getLocalHost(),   //本机IP地址8888                      //端口号);System.out.println("客户端开始连接 ...");//此处会阻塞等待连接成功socket.connect(inetSocketAddress);System.out.println("客户端连接成功");//连接成功后, 开始执行后续操作socket.getOutputStream().write("Hello World".getBytes());System.out.println("客户端写出 Hello World 成功");} catch (IOException e) {e.printStackTrace();}}
}

4 . 执行结果 :

① 启动服务器 :

② 启动客户端 :

③ 使用 Telnet 客户端测试 localhost 8888 端口 :

  • 建立连接 : 在命令行工具中 , 使用 telnet localhost 8888 连接本机的 8888 端口 ;

  • 连接成功后 , 按下 Ctrl + ] 快捷键 , 进入 Telnet 命令行 , 输入 send Hello World 命令 , 向本机的 8888 端口发送 Hello World 字符串 ;

  • 服务器端显示 :

VII . BIO 模型实例分析


BIO 模型实例分析 : 针对上述 BIO 实例 , 从性能 , 线程个数 , 阻塞 等角度分析 BIO 模型 ;

① 线程维护个数 : 在服务器端 , 需要针对每个客户端连接都创建一个线程 , 有多少连接 , 就需要有多少线程 ;

② 性能分析 : 如果客户端数量很多 , 那么大量客户端同时连接 , 其并发数量很大 , 对系统的资源占用较高 ;

③ 阻塞分析 : BIO 模型中 , 服务器端有两处阻塞 , 一个是等待客户端连接 , 一个是连接后 , 等待客户端发出请求数据 , 后者的阻塞等待完全就是对资源的浪费 , 没有数据交互 , 一直占用资源 ;

【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )相关推荐

  1. 从同步阻塞聊到Java三种IO方式

    对于刚刚成为程序猿不久的人,可能常常会被以下几个概念所混淆: 同步,异步,阻塞,非阻塞?以及从这几个概念中衍生出的几个概念,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞? 小编从网上查了一些资料,发现对 ...

  2. 灰、黄、蓝三种颜色的收集装置模型练习及实现思路

    下图模型中,灰.黄.蓝三种颜色的收集装置各1个.灰.黄.蓝三种颜色的方形环各3个.方形环随机摆放在收集装置上.要求将方形环进行移动,通过最少次移动,使方形环颜色与收集装置颜色一致.每次可移动一个方形环 ...

  3. 常用的三种线性模型算法--线性回归模型、岭回归模型、套索回归模型

    常用的三种线性模型算法–线性回归模型.岭回归模型.套索回归模型 线性模型基本概念 线性模型的一般预测模型是下面这个样子的,一般有多个变量,也可以称为多个特征x1.x2.x3 - 最简单的线性模型就是一 ...

  4. Java 三种模型,四种策略

    Java 三种模型,四种策略 (转) 混淆事务模型与事务策略是一个常见的错误.本系列关于 事务策略 的第二篇文章将概述 Java™ 平台支持的三种事务模型,并介绍使用这些模型的四种主要事务策略.通过使 ...

  5. reactor线程模型_面试一文搞定JAVA的网络IO模型

    1,最原始的BIO模型 该模型的整体思路是有一个独立的Acceptor线程负责监听客户端的链接,它接收到客户端链接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客 ...

  6. 时序预测的三种方式:统计学模型、机器学习、循环神经网络

    作者 | luanhz 来源 | 小数志 导读 时序预测是一类经典的问题,在学术界和工业界都有着广泛的研究和应用.甚至说,世间万物加上时间维度后都可抽象为时间序列问题,例如股票价格.天气变化等等.关于 ...

  7. io多路复用的原理和实现_IO多路复用的三种机制:select 、poll 、epoll

    目录 概述 IO多路复用本质 IO多路复用的优势 IO多路复用Select机制 IO多路复用Poll机制 IO多路复用Epoll机制 select,poll,epoll机制区别总结 php7进阶到架构 ...

  8. Android性能优化--IO 优化( IO基本知识:应用程序、文件系统和磁盘,三种IO方式及适用场景,多线程阻塞IO和NIO)

    目录 I/O 的基本知识 1. 文件系统 2. 磁盘 Android I/O 1. Android 闪存 2. 两个疑问 疑问一:文件为什么会损坏? 疑问二:I/O 有时候为什么会突然很慢? 不同的场 ...

  9. hadoop离线阶段(第十三节)数据仓库、hive简介、hive安装和hive的三种交互模式

    目录 数据仓库 数据仓库的基本概念 数据仓库的主要特征 数据仓库与数据库区别 数据仓库分层架构 数据仓库元数据管理 Hive简介 什么是Hive Hive的特点 Hive架构 Hive与Hadoop的 ...

最新文章

  1. GPT-3 1750亿参数少样本无需微调,网友:「调参侠」都没的当了
  2. 中南大学计算机有网络安全,中南大学2019年大学生网络安全知识竞赛(复赛)成功举行...
  3. JZOJ 3.10 1542——跑步(树状数组+模拟+排序/归并排序)
  4. 20172329 2017-2018-2 《程序设计与数据结构》实验四报告
  5. .gitignore失效 无法忽略node_modules问题
  6. bzoj 4598: [Sdoi2016]模式字符串
  7. sparkpython效率低_Effective PySpark(PySpark 常见问题)
  8. 河里的水哪里去了——兼谈气候变暖与西方文明
  9. SVN客户端安装与使用
  10. 大数据量JSONObject.fromObject性能问题(大数据传给前台)
  11. java。用类描述计算机中CPU的速度和硬盘的容量。要求Java应用程序有4个类,名字分别是PC、CPU、HardDisk和Test,其中Test是主类。
  12. App提交审核被拒的原因汇总
  13. java tic tac toe_java – 对Tic Tac Toe的建议
  14. html制作页面书签的步骤,网页制作基础教程(二)html标签
  15. 【蓝桥杯】等差素数列
  16. 大数据具备的5大发展爆点,你准备抓住哪个呢?
  17. java中报405错误怎么办_405错误的解决方法
  18. 名帖110 董其昌 小楷《五经一论册》
  19. 微信小程序 接入第三方地图
  20. 海思HI3516板子初体验

热门文章

  1. oracle 字符串转为正数用 to_number()……
  2. oracle 的float(b)转
  3. PTA第二个编程题总结
  4. 视图、触发器、事务、存储过程、函数
  5. maven nexus memory optimization
  6. hibernate学习(4)
  7. Java程序(类的抽象与封装)
  8. Spring 依赖注入(二、注入参数)
  9. 网络数据的XML解析
  10. Objective-C ,ios,iphone开发基础:NSDictionary(字典) 和 NSMutableDictionary