当前位置: 首页 > news >正文

深入解析ES6+新语法:复杂的迭代器与生成器

 一、迭代器(Iterator):数据遍历的统一协议  

1. 迭代器协议的本质

**迭代器协议(Iterator Protocol)** 是一种标准化的数据访问接口,它要求对象实现一个 `next()` 方法,每次调用返回包含 `{ value, done }` 的对象。  
- **`value`**: 当前遍历的值  
- **`done`**: 布尔值,表示遍历是否结束  

const arrayIterator = {data: [1, 2, 3],index: 0,next() {return this.index < this.data.length ? { value: this.data[this.index++], done: false }: { value: undefined, done: true };}
};console.log(arrayIterator.next()); // { value: 1, done: false }

此迭代器通过内部维护的 `index` 状态,逐步遍历数组元素。

 2. 可迭代对象(Iterable)  

若对象实现了[Symbol.iterator]() 方法,则称为 可迭代对象。该方法返回一个迭代器,使得对象可被 `for...of` 等语法消费。

自定义可迭代链表:  

class LinkedList {constructor() {this.nodes = [];}add(node) {this.nodes.push(node);}[Symbol.iterator]() {let index = 0;return {next: () => ({value: this.nodes[index++],done: index > this.nodes.length})};}
}const list = new LinkedList();
list.add('a'); list.add('b');
for (const node of list) {console.log(node); // 'a', 'b'
}

 二、生成器(Generator):迭代器的超级语法糖  

1. 生成器的核心机制

生成器函数(function*)返回一个 生成器对象,该对象既是迭代器,也是可迭代对象。其核心能力在于:  
- 暂停与恢复执行:通过 `yield` 关键字中断函数,保留上下文状态  
- 双向通信:`yield` 可向外传递值,外部可通过 `next(arg)` 向内注入值  生成器执行流程  

function* gen() {const a = yield 1;const b = yield a + 2;yield b * 3;
}const g = gen();
console.log(g.next());      // { value: 1, done: false }
console.log(g.next(10));    // { value: 12, done: false } (a = 10)
console.log(g.next(5));     // { value: 15, done: false } (b = 5)
console.log(g.next());      // { value: undefined, done: true }

**关键点**:每次 `next(arg)` 的 `arg` 会赋值给左侧 `yield` 表达式的返回值。

2. 生成器的底层模型  

生成器本质是 **协程(Coroutine)** 的轻量级实现。与线程不同,协程的切换由开发者显式控制,且不涉及系统内核,因此极其高效。  

- 执行上下文栈:生成器暂停时,其执行上下文(变量、作用域链)被保存,恢复时重新压入栈顶  
- 状态机转换:Babel 等工具将生成器转换为带有 `switch-case` 的状态机代码  

 三、高级应用场景  

1. 异步流程控制:生成器的革命性贡献  

在 `async/await` 普及前,生成器 + Promise 是处理异步代码的终极方案,其核心模式如下:  

实现自动执行器  

function run(generator) {const g = generator();function handle(result) {if (result.done) return result.value;return result.value.then(data => handle(g.next(data)),err => handle(g.throw(err)));}return handle(g.next());
}run(function* fetchUser() {const user = yield fetch('/api/user');const posts = yield fetch(`/api/posts?userId=${user.id}`);return { user, posts };
}).then(data => console.log(data));

此模式直接催生了 `async/await` 的诞生,两者在 Babel 中被编译为类似的生成器代码。

 2. 无限数据流与惰性计算  

生成器天然适合处理大规模或无限序列,仅在需要时计算值,避免内存爆炸。

斐波那契数列  

function* fibonacci() {let [prev, curr] = [0, 1];while (true) {yield curr;[prev, curr] = [curr, prev + curr];}
}const seq = fibonacci();
console.log(seq.next().value); // 1
console.log(seq.next().value); // 1
console.log(seq.next().value); // 2
// 可无限调用,但每次只计算一个值

3. 复杂状态机  

生成器通过 `yield` 管理状态转移,代码比传统状态机更简洁。

 交通灯状态机  

function* trafficLight() {while (true) {yield 'Red';          // 返回 'Red'yield delay(3000);   // 返回 Promise,暂停 3 秒yield 'Green';        // 返回 'Green'yield delay(2000);   // 返回 Promise,暂停 2 秒yield 'Yellow';       // 返回 'Yellow'yield delay(1000);   // 返回 Promise,暂停 1 秒}
}function delay(ms) {return new Promise(resolve => setTimeout(resolve, ms));
}// 使用
const light = trafficLight();function runTrafficLight() {const { value, done } = light.next();if (done) return; // 如果生成器结束,退出if (typeof value === 'string') {console.log(value); // 更新 UI 为当前颜色runTrafficLight();  // 继续下一步} else if (value instanceof Promise) {value.then(() => runTrafficLight()); // 等待 Promise 完成后再继续}
}runTrafficLight(); // 启动交通灯

四、生成器与迭代器的未来  

1. 异步迭代器(Async Iterator)  

ES2018 引入的异步迭代器,允许迭代异步数据源(如数据库流、WebSocket):  
async function* asyncCounter() {let i = 0;while (i < 3) {await sleep(1000);yield i++;}
}
(async () => {for await (const num of asyncCounter()) {console.log(num); // 0, 1, 2(每秒输出一个)}
})();

 

相关文章:

深入解析ES6+新语法:复杂的迭代器与生成器

一、迭代器&#xff08;Iterator&#xff09;&#xff1a;数据遍历的统一协议 1. 迭代器协议的本质 **迭代器协议&#xff08;Iterator Protocol&#xff09;** 是一种标准化的数据访问接口&#xff0c;它要求对象实现一个 next() 方法&#xff0c;每次调用返回包含 { valu…...

【C语言】自定义类型:结构体

一、结构体类型的声明 我们前面学习操作符的时候已经接触过结构体了&#xff0c;下面我们回顾一下结构体的基本内容。 创建结构体的语法如上所示&#xff1a; struct是创建结构体的关键字&#xff0c;然后tag就是我们结构体的名称&#xff0c;member-list是结构体的成员列表&…...

微服务即时通信系统---(五)框架学习

目录 ODB 介绍 安装 build2安装 odb-compiler安装 ODB运行时库安装 mysql和客户端开发包安装 boost profile库安装 总体打包安装 总体卸载 总体升级 头文件包含和编译时指明库 ODB常见操作介绍 类型映射 ODB编程 类与接口介绍 mysql连接池对象类 mysql客户端…...

蓝桥杯练习day1:自除数

前言 自除数 是指可以被它包含的每一位数整除的数。 例如&#xff0c;128 是一个 自除数 &#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right &#xff0c;返回一个列表&#xff0c;列表的元素…...

0基础 | 上下拉电阻典型应用场景

三极管典型运用&#xff1a; 上拉电阻 下拉电阻 限流电阻 此处开关为三极管 左侧电阻&#xff1a;驱动电阻【限流电阻】 &#xff08;控制mos管&#xff09; 下面电阻&#xff1a;下拉电阻【关断电阻】 %%作用1&#xff1a; &#xff08;因为IO口输出信号分为低电平&…...

MySQL数据高效同步到Elasticsearch的四大方案

目录 引言 一、为什么需要MySQL到ES的同步&#xff1f; 二、四大同步方案对比 三、方案详解与代码实战 1. 应用层双写&#xff1a;简单但强耦合 2. 定时任务同步&#xff1a;可控的准实时 3. Logstash JDBC&#xff1a;离线迁移利器 4. Binlog监听&#xff1a;生产级实…...

Docker详解

云是一种服务理念。在云里docker是业务的最小载体 doker是管理容器的引擎&#xff0c;为应用打包、部署平台、而非单纯的虚拟化技术 1.轻量级虚拟化 2.一致性 4.高效的资源利用 5.易于部署和扩展 docker和虚拟机的区别&#xff1a; 虚拟机&#xff1a;真机需要一个操作系…...

清晰易懂的Maven安装教程(含自定义依赖包位置)

初学者也能看懂的 Maven 安装教程&#xff08;含自定义依赖包位置&#xff09; Maven 是一个强大的项目管理和构建工具&#xff0c;广泛用于 Java 项目的依赖管理和构建自动化。本教程将手把手教你如何在 Windows 系统上安装 Maven&#xff0c;并配置环境变量&#xff0c;同时…...

王道数据结构6.3

顶点x的第一个邻接点以及下一个邻接点 int first_neighbor(Algraph G, int x){if(G.vertices[x].firstarc! nullptr){return G.vertices[x].firstarc->adjvex;}else return -1; }int next_neighbor(Algraph G,int x,int y){ArcNode *pG.vertices[x].firstarc;while(p! null…...

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux&#xff0c;本质上是学习在命令行下熟练使用Linux的各类命令。 命令行&#xff1a;是一种通过输入命令和参数与计算机系统进行交互的方式&#xff0c;可以使用各种字符化命令对系统发出操作指令&#xff0c;打开Linux终端&#xff0c;进入命令行界面。 …...

贪心算法——c#

贪心算法通俗解释 贪心算法是一种"每一步都选择当前最优解"的算法策略。它不关心全局是否最优&#xff0c;而是通过局部最优的累积来逼近最终解。优点是简单高效&#xff0c;缺点是可能无法得到全局最优解。 一句话秒懂 自动售货机找零钱&#xff1a;用最少数量的…...

SPI 总线协议

1、协议介绍 SPI&#xff0c;是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。主节点或子节点的数据在…...

单片机开发资源分析的实战——以STM32G431RBT6为例子的单片机资源分析

目录 第一点&#xff1a;为什么叫STM32G431RBT6 从资源手册拿到我们的对STM32G431RBT6的资源描述 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 第一点&#xff1a;为什么叫STM32G431RBT6 对于命名规则不太熟悉的朋友看这里…...

物联网(IoT)架构中,平台层的应用与技术

在物联网(IoT)架构中,平台层是连接物理设备(感知层)和应用服务(应用层)的核心部分。它负责数据的采集、处理、存储、分析以及设备管理等功能,是物联网系统的“大脑”。以下是平台层的主要功能及其技术实现手段: 平台层的主要功能 设备管理: 功能:管理物联网设备的注…...

大语言模型的压缩技术

尽管人们对越来越大的语言模型一直很感兴趣&#xff0c;但MistralAI 向我们表明&#xff0c;规模只是相对而言的&#xff0c;而对边缘计算日益增长的兴趣促使我们使用小型语言获得不错的结果。压缩技术提供了一种替代方法。在本文中&#xff0c;我将解释这些技术&#xff0c;并…...

JVM 2015/3/15

定义&#xff1a;Java Virtual Machine -java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行 自动内存管理&#xff0c;垃圾回收 数组下标越界检测 多态 比较&#xff1a;jvm/jre/jdk 常见的JVM&…...

DeepSeek辅助学术写作中期能力及提示词分享

目录 确立三论 收集资料 选取论据 展开论证 大家好这里是AIWritePaper官方账号&#xff01;更多内容&#x1f449;AIWritePaper~在如今这个学术圈的“快车道”上&#xff0c;时间就像是一场永不停歇的赛跑&#xff0c;而论文质量则是那颗我们拼命追逐的“金苹果”。最近一款…...

Git 实战指南:本地客户端连接 Gitee 全流程

本文将以 Gitee(码云)、系统Windows 11 为例,详细介绍从本地仓库初始化到远程协作的全流程操作 目录 1. 前期准备1.1 注册与配置 Gitee1.2 下载、安装、配置客户端1.3 配置公钥到 Gitee2. 本地仓库操作(PowerShell/Git Bash)2.1 初始化本地仓库2.2 关联 Gitee 远程仓库3. …...

汇编基础知识

机器语言 1、机器语言是机器指令的集合&#xff0c;机器指令就是机器可以正确执行的命令&#xff0c;由二进制数组成 2、当今我们常用的是pc机&#xff0c;由一个芯片完成上述功能&#xff0c;即CPU是一种微处理器&#xff0c;每一种微处理器由于自身硬件设计和内部构造不同都…...

线程池的拒绝策略适用场景思考

ThreadPoolExecutor有四种拒绝策略。刚开始学习线程池的时候我就觉得&#xff0c;就是应该当任务饱和&#xff08;达到拒绝策略&#xff09;时&#xff0c;就应该拒绝任务&#xff0c;抛出异常。最近仔细思考了下&#xff0c;既然线程池这么设计&#xff0c;也应该有一定的道理…...

on-policy对比off-policy

目录 持续更新。。。 on-policy与off-policy的定义 Q-learning属于on-policy算法还是off-policy算法&#xff1f; 为什么off-policy适用于从离线经验或多种探索策略中学习&#xff0c;明明 On-policy 也可以基于探索学习的啊&#xff1f; 重要性权重方法 off-policy方法可…...

如何记录Matlab程序运行过程中所占用的最大内存(续)

在上一篇博客中&#xff0c;我们讨论了如何记录Matlab程序运行过程中所占用的最大内存。 博客原文&#xff1a;如何记录Matlab程序运行过程中所占用的最大内存-CSDN博客 但经过测试发现&#xff0c;这与实际有非常大的差异。运行如下例子&#xff1a; clear;clc; profile on…...

解决MySQL字符集冲突引发的“Illegal mix of collations”错误

引言 在开发过程中&#xff0c;我们常常会遇到数据库层面的字符集兼容性问题。本文将通过一个典型的案例&#xff0c;分析因字符集不匹配导致的 Illegal mix of collations 错误&#xff0c;并提供完整的解决方案&#xff0c;帮助开发者彻底规避此类问题。 问题现象 假设我们…...

Vue3:F12后,页面弹出runtime errors及提示的解决办法

解决&#xff1a; vue.config.jsdevServer: {client: {overlay: false}, },关闭提示 main.js // 定义特性标志 window.__VUE_PROD_DEVTOOLS__ false window.__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ false...

学习笔记:黑马程序员JavaWeb开发教程(2025.3.17)

11.5 案例-文件上传-阿里云OSS-入门 出现报错&#xff1a;Process exited with an error: 1 (Exit value: 1)&#xff0c;点击exec那一行&#xff0c;出现错误原因&#xff1a;Command execution failed. 在CSDN上找到了解决方法&#xff1a; 之后出现新的报错&…...

EDAS:投稿经验-word版本-问题解决

1. 字体不对&#xff0c;字体未嵌入问题 问题&#xff1a;word转PDF后&#xff0c;总是显示有字体格式不对&#xff08;忘记截图了&#xff09;。 办法&#xff1a;1. EDAS投稿PDF格式问题-CSDN博客-PDF上修改 IEEE论文检测的字体未嵌入问题Times New Ro…...

【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]

hello&#xff0c;好久不见&#xff01; 云边有个稻草人-CSDN博客 上篇内容&#xff0c;回顾一下吧【数据结构初阶第十八节】八大排序系列(上篇)—[详细动态图解代码解析]-CSDN博客 今天我们来学习下篇 目录 &#xff08;2&#xff09;快速排序 【挖坑法】 —思路 —思路…...

不可不知的分布式数据库-TiDB

不可不知的分布式数据库-TiDB 介绍TiDb架构TiDb与Mysql的区别功能特性性能表现数据可靠性运维管理成本 Docker部署TiDB1. 获取 TiDB 配置文件2. 启动 TiDB 集群3. 连接到 TiDB4. 停止和清理 TiDB 集群注意事项 实用案例TiDB实现分布式事务实现原理实现方式SQL 方式编程方式 注意…...

BUUCTF Pwn babyheap_0ctf_2017 Unsorted bin attack部分

checksec exeinfo 开启了全保护 64位 查看函数&#xff1a; 堆题 增删查改齐了 可以在编辑堆的时候重新设置大小 存在堆溢出 delete函数的指针清零了 无UAF 想法是通过unsorted bin泄露libc基址&#xff1a; from pwn import *p process(./babyheap) #p remote("node…...

AI绘画软件Stable Diffusion详解教程(11):图生图进阶篇(局部用上传蒙版重绘)

总的功能与上一篇相似&#xff0c;但是在Stable Diffusion网页上手工涂绘的方法&#xff0c;有可能会因不够精细&#xff0c;导致重绘的效果不佳&#xff0c;涂绘区与非涂绘区的衔接有可能会出问题。这个时候可以用photoshop来制作蒙版&#xff0c;精确的圈出需要重绘的地方&am…...

SAP的WPS导出找不到路径怎么办;上载报错怎么办

一.打开注册编辑器 二.输入以下地址 计算机\HKEY_CLASSES_ROOT\ExcelWorksheet\Protocol\StdFileEditing\Server 去除掉EXE后面的命令即可 二&#xff1a;WPS上载文件没反应怎么办 如何切换整合模式或多组件模式-WPS学堂 根据官方操作把整合模式改成多组件模式...

Go语言不定长参数使用详解

不定长参数&#xff08;Variadic Parameters&#xff09;使用详解 核心概念 语法特性&#xff1a;...T 表示函数可接受任意数量的T类型参数底层实现&#xff1a;不定长参数在函数内部实际存储为切片类型 []T展开操作符&#xff1a;调用时使用 slice... 可将切片展开为独立参数…...

django如何配置使用asgi

以下是 Django 配置使用 ASGI 的完整指南&#xff1a; 一、配置前提 Django 版本&#xff1a;确保使用 Django 3.0&#xff08;原生支持 ASGI&#xff09;必要依赖&#xff1a;pip install daphne channels二、基础配置步骤 1. 创建/修改 ASGI 入口文件 在 Django 项目根目录…...

在C语言基础上学Java【Java】【一】

众所周知&#xff0c;Java是C风格的语言&#xff0c;对于学过C语言的人学Java可以快速适应。 废话不多说&#xff0c;直接边看代码边学。 数据类型&#xff0c;输入和输出 public class a1 {//a1是类名&#xff0c;就是文件名&#xff0c;所有的可执行代码需要写在这个里面 /…...

使用 Promise 和 .then() 解决同异步问题

在购物车功能中&#xff0c;用户点击“加入购物车”或“删除购物车”时&#xff0c;可能会遇到数据同步问题。例如&#xff0c;当用户快速连续点击“删除”按钮时&#xff0c;可能会导致删除操作基于过时的数据&#xff0c;从而引发错误。为了解决这个问题&#xff0c;我们可以…...

defineExpose函数

在软件开发中&#xff0c;特别是在像 Vue.js 这样的框架中&#xff0c;defineExpose 是一个函数&#xff0c;用于显式地将组件的某些属性或方法暴露给其父组件或其他组件。这在你想控制组件的内部状态或功能对外部可见性时非常有用。 Vue.js 3 中的示例&#xff1a; <scri…...

LabVIEW烟气速度场实时监测

本项目针对燃煤电站烟气流速实时监测需求&#xff0c;探讨了静电传感器结构与速度场超分辨率重建方法&#xff0c;结合LabVIEW多板卡同步采集与实时处理技术&#xff0c;开发出一个高效的烟气速度场实时监测系统。该系统能够在高温、高尘的复杂工况下稳定运行&#xff0c;提供高…...

台式机电脑组装---电源

台式机电脑组装—电源 22 33 主板供电是聚集了12V&#xff0c;5V,3.3V的24pin CPU供电的话主要是12V的44pin供电 44pin合并之后&#xff0c;就是8pin 55 SATA硬盘会使用饼io口取电&#xff0c;从电源获取12v,5v,3.3v的电 33...

中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南

目录 背景‌一、环境规划与依赖准备‌1. 服务器规划(3节点集群)2. 系统与依赖‌3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置‌1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置‌4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…...

2023年蓝桥杯 省赛 ————特殊日期

2.特殊日期 - 蓝桥云课 错误原因&#xff1a; 分不清大小月&#xff0c;将闰年的2月天数当成了28天&#xff0c;非闰年当成了27天&#xff0c;因此出错 错误代码如下&#xff1a; package Lanqiao;import java.util.Scanner;/*** author zb* date2025/3/16 13:22*/ public …...

电动车出入库管理软件,电动车维修保养售后服务管理系统,佳易王电动车店管理系统操作教程

一、概述 本实例以 佳易王电动车店管理系统 为例说明&#xff0c;其他版本可参考本实例。试用版软件资源可到文章最后了解&#xff0c;下载的文件为压缩包文件&#xff0c;请使用免费版的解压工具解压即可试用。 软件特点&#xff1a; 操作便捷性高 软件功能实用且…...

计算机网络-综合布线系统

工作区子系统&#xff1a;由信息插座、插座盒、连接跳线和适配器组成 水平子系统&#xff1a;由一个工作区的信息插座开始&#xff0c;经水平布置到管理区的内测配线架的线缆所组成 管理子系统&#xff1a;由交连、互连配线架组成。管理子系统为连接其它子系统提供连接手段 …...

【蓝桥杯】24省赛:数字串个数

思路 本质是组合数学问题&#xff1a; 9个数字组成10000位数字有9**10000可能 不包括3的可能8**10000 不包括7的可能8**10000 既不包括3也不包括77**10000 根据容斥原理&#xff1a;结果为 9 ∗ ∗ 10000 − 8 ∗ ∗ 10000 − 8 ∗ ∗ 10000 7 ∗ ∗ 10000 9**10000 - 8**10…...

手写一些常见算法

手写一些常见算法 快速排序归并排序Dijkstra自定义排序交替打印0和1冒泡排序插入排序堆排序欧几里得算法求最大公约数 快速排序 public class Main {public static void main(String[] args) {int nums[] {1,3,2,5,4,6,8,7,9};quickSort(nums,0,nums.length - 1);}private st…...

AI自动生成数据

文章目录 概要案例生成简单的文本数据 概要 合成数据是人工生成的数据而不是从现实世界事件中收集的数据。它用于模拟真实数据&#xff0c;而不会泄露隐私或遇到现实世界的限制 安装依赖&#xff1a;pip install langchain_experimental 合成数据的优势&#xff1a; 1.隐私…...

【STM32】从新建一个工程开始:STM32 新建工程的详细步骤

STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中&#xff0c;下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构&#xff1a;STD_STM…...

【Go语言圣经3.6】

目标 概念 常量与变量的主要区别在于&#xff1a; 不可变性&#xff1a;常量在声明后其值就固定下来&#xff0c;不能再被修改。这保证了程序运行时不会因意外修改而导致错误。 使用不可变数据&#xff08;例如数学常数 π&#xff09;可以避免意外修改带来的问题 编译期计算…...

[IP]UART

UART 是一个简易串口ip&#xff0c;用户及配置接口简单。 波特率从9600至2000000。 该 IP 支持以下特性&#xff1a; 异步串行通信&#xff1a;标准 UART 协议&#xff08;1 起始位&#xff0c;8 数据位&#xff0c;1 停止位&#xff0c;无奇偶校验&#xff09;。 参数化配置…...

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理&#xff0c;欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图&#xff1a; 注意&#xff0c;下面谈及的所有方式&#xff0c;都要求两者的IP地址处于同一网段&#xff0c;涉及到的软件资源见felm。 一、Windows主…...

4.好事多磨 1

前言 我们已经学习了创建套接字和向套接字分配地址&#xff0c;接下来正式讨论通过套接字收发数据。 之前介绍套接字时举例说明了面向连接的套接字和面向消息的套接字这2种数据传输方式&#xff0c;特别是重点讨论了面向连接的套接字。这次将具体讨论这种面向连接的服务器端/客…...