一、多路复用

2023-10-26

1.什么是多路复用

数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。采用多路复用技术能把多个信号组合起来在一条物理信道上进行传输,在远距离传输时可大大节省电缆的安装和维护费用频分多路复用FDM (Frequency Division Multiplexing)和时分多路复用TDM (Time Division Multiplexing)是两种最常用的多路复用技术。

1.1 非多路复用

在这里插入图片描述

1.2 多路复用

在这里插入图片描述

1.3 多路复用与BIO(Blocking IO)

​ 单一连接的情况下,BIO是完全满足要求的,但是我们做网站肯定不是只为一个用户服务的,那么如果有多个socket client来,我们的server就不满足了,我们做个。所以BIO是无法实现多路复用的,只能实现信道与接收一一对应,无法实现复用。

1.3.1 BIO的示例代码:
class BIOSocketServerMultiThread(private val acceptSocket: Socket) : Thread() {
    override fun run() {
        while (!acceptSocket.isClosed) {
            println("------start receive------")
            val byteArray = ByteArray(1024 * 2)
            val readCount = acceptSocket.getInputStream().read(byteArray)
            var readContent = String(byteArray, 0, readCount)
            println(readContent)
            sleep(1000)
        }
    }
}

fun main() {
    val newFixedThreadPool = Executors.newCachedThreadPool() //线程池
    val serverSocket = ServerSocket(8888)
    while (!serverSocket.isClosed) {
        val accept = serverSocket.accept()
        println("accept socket client")
        val bioSocketServerMultiThread = BIOSocketServerMultiThread(accept)
        newFixedThreadPool.submit(bioSocketServerMultiThread)
    }
}

而且随着客户端数量的增加,会造成线程爆炸。即使使用了线程池,也需要非常大的线程池容量,并且线程上下文切换的成本也较高。

1.4 多路复用与NIO(NonBlocking IO)

多路复用前面我们图已经讲解了一下,多路复用其实也存在于生活中,比如快递柜、快递员、包裹、客户。如果没有快递柜,快递每次都需要打电话给客户,然后客户在家接收包裹,如果买了好几件东西,在不同时间收,那么你需要多次接电话,多次与快递员通信。这就是我们前面说的BIO场景。

但此时如果有快递柜,即使在不同时段,不同的快递员,你也可以统一去快递柜取快递,这个作用就和多路复用非常像了。这里的快递柜就相当于多路复用NIO的Selector/Poll/Epoll。接下来我们将用三篇文章,来分别讲述Selector/Poll/Epoll

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一、多路复用 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要

随机推荐

  • 【腾讯云 Cloud Studio 实战训练营】丝滑体验:用 Cloud Studio 实现一个精确计时的时钟

    当今的云计算技术已经越来越成熟 基于云计算技术进行云端开发已经成为最新趋势 而 Cloud Studio 是一个基于云计算的 Web 端开发微服务平台 提供了代码编辑器 调试器 代码库 以及自动构建和部署工具等各种功能 帮助开发者在云端开发
  • druid 配置

    spring datasource druid连接池 type com alibaba druid pool DruidDataSource 数据库驱动 driver com mysql jdbc Driver 最大连接池数量 max ac
  • 开源协议详解

    开源在今天的软件业已经很普遍 但开源是否意味着使用者可以对开源后的代码为所欲为呢 答案是否定的 开源运动同样有自己的游戏规则和道德准则 不遵行这些规则不但损害开源运动的健康发展 也会对违规者造成名誉和市场上的损失 更可能陷入法律纠纷和赔偿
  • gitlab Undefined method `provider' for nil:nilclass 登陆提示处理

    使用管理员用户 在管理区域 用户管理里面 搜索对应用户 修改用户身份里面的LDAP身份为正确信息
  • 【基础】Unity:Application的常用方法

    Application的常用方法 static void LoadLevel int index static void LoadLevel string name static void CaptureScreenShot string
  • php使用区块链_PHP实现区块链

    作者 列旭松 来源 高可用架构 原文链接 http t cn RgjsJ1i 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 来自 Linux内核那些事 微信号 like linux 作者 列旭松 唯品会资深工程师 曾任
  • C++标准演绎(未完)

    作者 略游 q群 512 001 256 一 词汇定义 标准 standard C 语言标准 在代码世界里 我们假设与公理等价 结论 由标准推导出的事实 规定 便于讨论 我们设定的一些规则 类型 type 同一类型 它们在C 内存布局一致
  • 简谈拉电阻

    简谈拉电阻 前言 拉电阻 弱拉和强拉 上拉和下拉 前言 电路设计中经常设计到拉电阻的概念 与常用的GPIO口的配置也息息相关 网上也有很多的总结 不多累述 简单的总结拉电阻相关的一些概念 拉电阻 拉电阻分为上拉电阻 pull up 和下拉电
  • powerdesigner常用配置-修改外键设置

    文章目录 取消自动生成外键列 PowerDesigner给两个表添加reference 中间显示外键信息步骤 取消自动生成外键列 PowerDesigner给两个表添加reference 中间显示外键信息步骤
  • Floyd算法(三)之 Java详解

    前面分别通过C和C 实现了弗洛伊德算法 本文介绍弗洛伊德算法的Java实现 目录 1 弗洛伊德算法介绍 2 弗洛伊德算法图解 3 弗洛伊德算法的代码说明 4 弗洛伊德算法的源码 转载请注明出处 http www cnblogs com sk
  • 记一次XFS文件系统崩溃的处理

    1 问题出现 当使用rpm安装服务时 出现如下问题 当使用yum时也是一样 查了 var log messages发现以下错误 看起来是XFS的问题 可以发现dm 0实际是bel root的问题 查了网上很多解决方法都是说要使用xfs re
  • TCP/IP 报文格式(IP数据包、TCP报头、UDP报头)

    TCP IP 报文格式 IP数据包 TCP报头 UDP报头 一 IP包格式 IP数据包 是一种可以变长的分组 由首部与数据负载组成 首部长度为20 60字节 Byte 后40字节是可选的 但长度不固定 前20字节格式为固定 数据负载部分的长
  • 医疗器械维修工程师好做吗?赚钱吗?

    彩虹医疗器械维修培训第二期长期班安排 学技术 考证书 工作技术支持 彩虹介绍 彩虹医械维修培训中心成立于2003年 至今已有十余年的时间 为满足社会需求 推进医疗器械维修技术发展 开展医疗器械的维修技术培训 在社会上取得了良好的反应和口碑
  • 嵌入式Linux驱动开发(I2C专题)(四)

    编写APP直接访问EEPROM 参考资料 Linux驱动程序 drivers i2c i2c dev c I2C Tools 4 2 https mirrors edge kernel org pub software utils i2c
  • 在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性

    引言 作为全球领先的开源分布式 MQTT Broker EMQX 在 5 0 版本中引入了 MQTT over QUIC 将 MQTT 协议的优势与 QUIC 的特性相结合 通过充分利用 QUIC 协议低连接开销和多路复用的特点 MQTT
  • 入职避坑指南(杭州)

    前言 求职都说金三银四 今天和大家分享一个亲身经历的事情 今天讲的是杭州 群电商公司 规模500人左右 说说我被公司白瞟的亲身经历 希望看到这篇文章的同学能避开这些坑 面试过程 公司比较远 附近没有地铁 大概坐了一个多小时的公交车去面试 到
  • CompletableFuture使用详解

    https blog csdn net admin123404 article details 111168902
  • Centos7.9搭建kafka-3.2.0集群,三台机器组成,并安装安装eagle 监控

    目录 1 准备工作 2 搭建zookeeper集群 3 搭建kafka集群 4 测试kafka集群 4 1 命令测试 4 2 java代码测试 5 安装eagle 监控 1 准备工作 kafka 3 2 0的单机安装教程如下 CentOS7
  • MySQL的全连接

    从这篇博客开始 从高端大气的计算机视觉方向转行做JAVA开发了 接下来的博客就是JavaJavaJava了没有世界上最好用的pythonpythonpython 由于MySQL不支持FULL JOIN 所以 需要使用UNION来实现全连接
  • 一、多路复用

    1 什么是多路复用 数据通信系统或计算机网络系统中 传输媒体的带宽或容量往往会大于传输单一信号的需求 为了有效地利用通信线路 希望一个信道同时传输多路信号 这就是所谓的多路复用技术 Multiplexing 采用多路复用技术能把多个信号组合