网络通信、BIO、NIO

1. 涉及的网络基础知识

Socket:

操作系统提供的api,介于应用层和tcp/ip层之间的软件层,封装服务器客户端之间网络通信相关内容,方便调用

IO多路复用:

(I/O Multiplexing)是一种IO操作模式,它允许单个进程或线程同时处理多个输入输出(IO)操作。

怎么算一个连接:

tcp层中,客户端ip、客户端端口、服务器ip、服务器端口,这4个算一个连接。

通信接收流程:

3步:接收连接、读取数据、写入数据

服务器端接收连接、服务器端读取客户端发来的数据、服务器端写入客户端发来的数据并进行业务处理。

应用程序java在处理通信的两个前提:

1、客户端a与服务器b通信,a的数据到达b的操作系统的socket的缓冲区中。这时候java要如何接收并处理这些数据呢?java会调用操作系统提供的socket api进行操作。

2、如果很多客户端与服务器b通信,并发量上来了,java又如何管理和处理这么多的连接呢?java有BIO(Blocking I/O,阻塞IO)和NIO(no-blocking I/O,非阻塞)两种

2. Java NIO和BIO的区别

  1. 阻塞与非阻塞
    • BIO是同步阻塞的。当线程发起I/O请求时,如果没有数据可读或可写,线程会一直阻塞,直到数据准备就绪。
    • NIO是同步非阻塞的。线程发起I/O请求后,如果没有数据可读或可写,线程不会阻塞,而是可以去做其他事情。当数据准备就绪时,线程会被通知去处理数据。
  2. I/O模型
    • BIO是基于流的。数据被顺序地从一个流读取到另一个流,期间没有缓存,且不能前后移动流中的数据。
    • NIO是基于缓冲区的。数据被读取到一个缓冲区中,需要时可以在缓冲区中前后移动,增加了处理过程中的灵活性。
  3. 线程管理
    • BIO中,每个连接都需要一个独立的线程来处理。这种方式在连接数较少时可行,但在连接数较多时会导致线程数量过多,系统资源消耗大。
    • NIO中,一个线程可以处理多个连接。这是通过Selector和Channel实现的,Selector可以监听多个Channel上的事件,从而允许单个线程管理多个连接。这就是IO多路复用。
  4. 适用场景
    • BIO适用于连接数较少且固定的场景。
    • NIO适用于连接数多且连接时间较短的场景,如聊天服务器、弹幕系统等。它能够有效减少线程数量,降低系统资源消耗,提高并发处理能力。

3、BIO和NIO详解

如果服务器b上同时有多个连接,下面我称为连接1号、连接2号等。

  • 基础版本:java原生bio

流程:读取连接1号socket中的数据,如果数据没有准备好,或者遇到一些其他问题,就会阻塞,一直等到问题解决好。连接1号处理好后,开始处理连接2号,获取连接2号数据与业务处理。

缺点:阻塞,并发量小

 

  • 改进版:伪异步IO

725a8c9128824cdea0e688d0fb8671e9.png

f2ef6fb50c8142f29590c1bf3dcfc497.png

f3a9dc6548d74ba992897556e963bcc7.png

流程:acceptor+处理器。acceptor用来处理连接,处理器用来接收和处理数据。连接1号来了,acceptor就开一个新线程交给一个处理器a去获取连接1号socket数据并业务处理数据。接着acceptor给连接2号开个新线程,交给处理器b去接收并业务处理连接2号。这样连接1号和2号就同时处理了。

优点:并发量大,因为开了线程

缺点:如果并发量多,线程多,消耗多,可能内存爆掉,这点可以通过线程池来控制线程量。

但是因为处理器本身还是阻塞的,如果连接1号的数据没准备好,读取不了数据,这个时候处理器a会等待,也就是cpu在等待,cpu时间其实就浪费了,所以如果并发量很大,性能还是不高

 

  • 改进版:非阻塞IO

流程:如果连接1号的处理器的数据还没准备好,读取不了,这个时候cpu不等待,cpu可以先去处理其他的连接,这个就是不阻塞啦,cpu处理好其他连接,回来处理连接1号时,此时连接1号的数据准备好了,cpu就能顺利的接收连接1号的数据并进行业务处理。

缺点:这个是让cpu在所有处理器(连接1号、连接2号...)中做个轮询,但可能这次轮询到1号,发现1号还是没有准备好,所以还有没有更好的办法呢?

 

  • 改进版:原生jdk网络编程——NIO

3a6fee5fbdf14f68a1851a4e377c2864.png

1b9ae9847e604d2a9611da38d470a5b8.png

3d712a1955924dd3a48aba307b4f7c2e.png

1、Reactor反应器模式

就是一种倒转思维,由处理器主动发布信号

接着上边的讲。如果cpu轮询,发现1号还是没有准备好,那不是也浪费了cpu资源?

所有最好是1号准备好了,来叫我,这时候我cpu去处理就比较顺利。每个连接准备好了,给个信号,我cpu只去处理有这个信号的连接,这样就更快一点。这就是反应器模式!

2、三大组件:selector、channel、buffer

selector:

相当于cpu、acceptor,主要起到记录和调度作用。记录事件与channel的关系,从而帮助分配channel

channel:

相当于处理器。主要有两个

ServerSocketChannel:相当于acceptor,是一个可以监听TCP连接请求的通道。当服务器程序创建一个ServerSocketChannel并绑定到一个特定的端口后,它就开始监听该端口上的连接请求。需ServerSocketChannel本身并不直接“接收”连接,而是触发了一个“连接到达”的事件,即给个“有连接啦”的信号,告知一下

SocketChannel:相当于处理器。一个socketChannel处理一个连接,一个连接可能有多个socketChannel。主要是接收这个连接的数据,并调用业务代码处理数据。

buffer:

用于存储数据,channel从buffer中读写数据

3、服务器端流程:

接收连接

ServerSocketChannel去selector注册,关注OP_ACCEPT接收事件。ServerSocketChannel绑定8808端口,会监听tcp层8808端口,如果发现有连接到达,ServerSocketChannel会给信号,就是触发一个OP_ACCEPT接收事件。 

selector一直在轮询,查看注册下的channel中是否有事件触发,有的话就回去执行channel。这时候发现ServerSocketChannel触发注册时关注的OP_ACCEPT事件了,selector就调用ServerSocketChannel的accept()方法开始接收连接,ServerSocketChannel就会创建并返回一个SocketChannel,然后把这个SocketChannel注册到selector上,并写上关注OP_READ事件,然后ServerSocketChannel就接着去监听还有没有新的连接到来了。接收并处理这个连接的内容是由这个SocketChannel去做的。

处理连接数据

连接socket的数据准备好了,操作系统会更新数据状态,channel就会知道(因为channel的底层是socket),然后就会给出信号,触发一个OP_READ可读事件。

selector一直在轮询,查看注册下的channel中是否有事件触发,发现这个SocketChannel注册时关注的OP_READ事件触发了,就会调用SocketChannel的read()方法,执行相关操作。这个channel可以设置为非阻塞,非阻塞的话就是,如果出现问题,直接返回一个值。也可以设置为阻塞,阻塞的话,就是出现问题,一直等待。

4、理解

所以这里的cpu是selector,selector一直在轮询那些事件触发了(也就是准备好了的,大概率不会阻塞的)的channel,然后去执行channel,这样cpu就不会闲置,通过selector就能管理多个channel,即管理多个连接。而channel呢,就不是被动接受,而是主动告知selector,channel自己监控自己,当准备好了,就触发下事件,主动给告知selector。

优点:最大限度压榨cpu性能,让cpu不闲着

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 的 metaclass

文章目录 先说结论1. metaclass 的作用2. 主要的执行过程 1. metaclass.__new__2. metaclass.__call__关于 metaclass.__init__ 3. metaclass.__prepare__4. 自动创建 __slots__ 属性4.1 metaclass 的接口类4.2 metaclass conflict 5. Class metaprogramming 先说结论 1. meta…

Java技术栈总结:JVM虚拟机篇

一、Java的四种引用类型 1、强引用 最常见的引用,类似Object obj new Object()、String str “hello”。如果一个对象具有强引用,垃圾回收器绝对不会回收它。即使抛出“OutOfMemoryError”错误,程序终止,也不会随意回收具有强引…

20240710 每日AI必读资讯

🤖微软:不会像 OpenAI 一样阻止中国访问 AI 模型 - OpenAI 将于周二(7 月 9 日)开始阻止中国用户访问其 API。 - 微软发言人表示:Azure OpenAI API服务在中国的提供方式没有变化。 - 公司仍然通过部署在中国以外地区…

妙笔生词智能写歌词软件:创新助力还是艺术之殇?

在音乐创作日益普及和多样化的当下,各种辅助工具层出不穷,妙笔生词智能写歌词软件便是其中之一。那么,它到底表现如何呢? 妙笔生词智能写歌词软件(veve522)的突出优点在于其便捷性和高效性。对于那些灵感稍…

c/c++:牛客小白月赛93

比赛链接 A 生不逢七 题目描述(题目链接添加链接描述): 睡前游戏中最简单又最好玩的游戏就是这个啦! 该游戏规则为:多名玩家轮流报数,当要报的数字中含有 7 或者是 7 的倍数时(例如 37,49)&…

腾讯又一平台即将停止运营

随着腾讯公司业务和战略的调整,某些业务逐渐退出历史舞台,如“腾讯直播平台NOW”,以及“QQ签到”,“腾讯待办”,“企鹅FM音频平台”等,最近又有一则重磅消息,那就是“腾讯课堂”也即将停止运营。…

类似评论、省市区这种具有层次结构的数据表怎么设计?

业务功能模块 评论、回复模块省市区表 设置一个给每个数据设置一个parent_id 例如: 某个视频下a写了条评论,那a的parent_id就是0;b回复了a,那b的parent_id就是a的id;c回复了b,那c的parent_id就是b的id; 这样,所有评论…

Mosh|初学者 SQL 教程

sql文件链接:链接: https://pan.baidu.com/s/1okjsgssdxMkfKf8FEos7DA?pwdf9a9 提取码: f9a9 在mysql workbench 导入 create_databases.sql 文件,下面是运行成功的界面 快捷方式:全部运行可以同时按下controlcommandenter ,或者…

ceph存储

1 存储简介 存储的三种方式包括:块存储、文件存储、对象存储1。此外,还有内存存储、硬盘存储和闪存存储2。 内存存储:临时性数据存储方式,存储速度快,容量有限,通常用来存储正在使用的程序和数据。硬盘存…

【通信协议】八、CDL(Caterpillar Data Link)协议解析

1、协议简介 CDL(Caterpillar Data Link)是caterpillar的通信协议,该品牌发动机ECM与各控制单元进行通信时,采用基于RS-485的物理层规范进行开发的CDL协议进行通信; 2、物理层 信号传输方式:差分信号(通过两条线的电…

稀疏建模介绍,详解机器学习知识

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

集训 Day 2 模拟赛总结

复盘 7:30 开题 想到几天前被普及组难度模拟赛支配的恐惧,下意识觉得题目很难 先看 T1,好像不是很难,魔改 Kruskal 应该就行 看 T2 ,感觉很神奇,看到多串匹配想到 AC 自动机,又想了想 NOIP …

328. 奇偶链表

https://leetcode.cn/problems/odd-even-linked-list/https://leetcode.cn/problems/odd-even-linked-list/ 解题思路: 把第一个和第二个节点分别作为奇数、偶数的头节点,当遇到奇节点,删除,并插入到奇数头节点后,这样…

PPI(每英寸像素数)、DPI(每英寸点数)和Pixel(像素)的区别和联系?

一、定义 PPI、DPI和Pixel是图像处理、打印和显示领域中常用的三个概念,它们之间既有区别又有联系。以下是对这三个概念进行分别讲解: 1. PPI(Pixels Per Inch)-即每英寸像素数,是图像分辨率的一种表示方…

理解点对点协议:构建高效网络通信

在通信线路质量较差的年代,能够实现可靠传输的高级数据链路控制(High-level Data Link Control, HDLC)协议曾是比较流行的数据链路层协议。HDLC是一个较复杂的协议,实现了滑动窗口协议,并支持点对点和点对多点两种连接…

钉钉扫码登录第三方

钉钉文档 实现登录第三方网站 - 钉钉开放平台 (dingtalk.com) html页面 将html放在 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录</title>// jquery<script src"http://code.jqu…

Qt:12.输入类控件(QSpinBox-整数值输入的小部件、QDateEdit、QTimeEdit、QDateTimeEdit- 日期和时间输入的控件)

目录 一、QSpinBox-整数值输入的小部件&#xff1a; 1.1QSpinBox介绍&#xff1a; 1.2属性介绍&#xff1a; 1.3通用属性介绍&#xff1a; 1.4信号介绍&#xff1a; 二、QDateEdit、QTimeEdit、QDateTimeEdit- 日期和时间输入的控件&#xff1a; 2.1QDateEdit、QTimeEdit…

机器人伦理分析:从扫地机器人到智能伙伴

我发过一个泡泡&#xff1a;机器人和扫地机器人。 意犹未尽&#xff0c;我觉得这是一个值得讨论下去的话题。或者是未来话题 在科技迅猛发展的今天&#xff0c;机器人已经从简单的执行工具演变为能够执行复杂任务的智能实体。特别是在家庭环境中&#xff0c;扫地机器人已经成为…

Mac下flutter运行iOS模拟器

上篇flutter环境安装&#xff08;Macvscode&#xff09;已经将vscode和xcode等开发环境都搭建起来了&#xff0c;vscode新建工程还是比较方便的&#xff0c;那么&#xff0c;建立好了之后&#xff0c;我们怎么看效果呢&#xff1f; 1. vscode新建项目 通过 vscode的命令命板(…

零信任网络安全

随着数字化转型的发生&#xff0c;网络边界也在不断被重新定义&#xff0c;因此&#xff0c;组织必须使用新的安全方法重新定义其防御策略。 零信任是一种基于“永不信任&#xff0c;永远验证”原则的安全方法&#xff0c;它强调无论在公司内部或外部&#xff0c;任何用户、设…