C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
目录
前言
一、网络的含义与构成
含义:
构成:
二、网络的体系结构
1>OSI七层模型
2>TCP/IP协议体系结构
3>数据经过体系结构,怎么封装?
4>端口号
5>大小端序
6>TCP/UDP传输层的协议
三、系统函数API学习框架(TCP)
服务器(优先):
客户端:
四、服务器和客户端代码实例
总结
前言
网络编程是指使用编程语言进行网络通信的过程。通过网络编程,计算机可以通过互联网或局域网与其他计算机进行数据交换和通信。在网络编程中,程序员需要使用特定的网络编程接口和协议(如TCP/IP、HTTP等)来实现数据的发送和接收。网络编程常用于开发网络应用、远程服务和分 布式系统等。
网络编程具有以下几个重要的作用:
-
数据交换和通信:通过网络编程,计算机可以在网络上进行数据的发送和接收,实现信息的交换和通信。这对于实现远程服务、分布式系统以及网络应用等都非常重要。
-
分布式系统:通过网络编程,可以将多台计算机连接起来,形成一个分布式系统。在分布式系统中,不同计算机之间可以互相通信和协作,共享资源和处理任务,从而提高系统的可靠性、性能和扩展性。
-
网络应用开发:网络编程是开发网络应用(如Web应用、聊天室、在线游戏等)的基础。通过网络编程,可以实现服务器端和客户端之间的数据交互,从而实现用户与服务器的交互和信息的展示。
-
网络安全:网络编程也与网络安全密切相关。通过网络编程,可以实现加密、认证、防止信息泄漏等安全机制,保护网络通信的隐私和安全。
总之,网络编程为计算机之间的数据交换和通信提供了技术基础,成为了构建分布式系统、开发网络应用以及保障网络安全的重要手段。
一、网络的含义与构成
含义:
1.什么是网络?
网络是信息传输、接收和共享的虚拟世界,通过把地球村内所有
信息汇聚起来,从而实现这些资源的共享。
初衷:知识共享
构成:
2.计算机上的软件层面的网络是由什么构成?
1>IP
格式:
点分十进制 用户浏览与编写 192.168.10.x
网络二进制 系统、电脑看的 0、1组合
分类:
IPv4 (主要集中,应用在电脑)
点分十进制 4个字节
网络二进制 32位
(42个ip地址)
IPv6 (手机WiFi、目前在电脑中不集中)
点分十进制 16个字节
网络二进制 128位
IPv4分五类
A B C D E
大型网 中大型 中小型 组播型 待用型
(1)A类地址
网络二进制:是以0开头
1个网络地址 3个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
00000000 00000000 00000000 00000001 - 01111111 11111111 11111111 11111110
点分十进制:
0.0.0.1-127.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址
(2) B类地址
网络二进制:是以10开头
2个网络地址 2个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
10000000 00000000 00000000 00000001 - 10111111 11111111 11111111 11111110
点分十进制:
128.0.0.1-191.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址(3)C类地址
网络二进制:是以110开头
3个网络地址 1个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110
点分十进制:
192.0.0.1-223.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址(4)D类地址
网络二进制:是以1110开头
4个网络地址 0个主机地址(网络地址等于你在哪个教室,主机地址
代表你在教室中的位置)
网络二进制:
11100000 00000000 00000000 00000001 - 11101111 11111111 11111111 11111110
点分十进制:
224.0.0.1-239.255.255.254
注意:
主机位全为0,定义为网段号,网络ID号
主机位全为1,定义广播地址
(5)E类地址
未来可期2>子网掩码
网络地址全为1,主机全为0
255.255.255.0
用来判断是否在同一网段
前缀长度:24(主要看子网掩码中1的个数)
-->在linux网络配置中有体现
3>默认网关
主机地址默认值为1,随机取1-254,掐头去尾
用来管理当前网段下的信息传输;网络的门户
-->结合图片理解
4>DNS域名解析服务器
按照地方运营商提供的DNS域名服务器
202.98.128.86
www.baidu.com
IP所属地:广东、深圳
二、网络的体系结构
1.OSI七层模型
ISO公司推出的网络体系模型
协议:双方规定好的通信规则
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
目的:将数据封装起来,形成一个约定好的通信协议
缺点:太复杂,太繁琐,有写功能重复
2.TCP/IP协议体系结构
应用层 ftp、http、ping、ssh
传输层 TCP、UDP
网络层 IP、ICMP、IGMP
物理层 网线
重点学习的网络体系结构,网络协议中的世界
3.数据经过体系结构,怎么封装?
封装数据的目的是为了保证数据在网络中传输的稳定性
-->结合图片理解
4.端口号
区分不同的应用程序,针对主机
QQ4999,微信5050
2个字节 0~65535
0~1023 --》系统进程使用的
1024~65535 --》用户用的
5.大小端序
不同类型的CPU的主机中,内存存储的整数字节序有两种
小端序:
低位字节存储到低位地址, linux
大端序:
低位字节存储到高位地址, 系统
6.TCP/UDP传输层的协议
TCP/UDP的区别:
UDP(用户数据报协议)的特点:只管发送,没有连接属性,数据因此不可靠,不稳定,易丢失。
举例:写信
TCP(传输控制协议)的特点:要先建立连接,保证了数据的可靠信,因此数据稳定,不丢包。
举例:带电话
三、系统函数API学习框架(TCP)
服务器(优先):
框架:
1>创建socket套接字
2>绑定自己的IP地址和端口号
3>监听
4>等待客户端连接
5>数据收/发
6>关闭套接字(具有网路属性的文件描述符)
1.创建socket套接字 (socket)
头文件:
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
功能:
创建一个具有网络属性的文件描述符
参数:
domain:协议族
AF_UNIX,AF_LOCAL 本地连接
AF_INET IPv4
AF_INET6 IPv6
type:
SOCK_STREAM 流式套接字 TCP
SOCK_DGRAM 数据报套接字 UDP
SOCK_RAW 原始套接字
protocol:
默认为0,表示前面两个所选参数生效
返回值:
成功返回具有网络属性的文件描述符
失败,返回-1并设置错误码
socket位于哪里,位于应用层和传输层之间
2.绑定自己的IP地址和端口号(bind)
头文件:
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
功能:
将IP地址和端口号绑定在sockfd上,难点在于第二参结构体赋值
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
my_addr:结构体指针,用来赋值IP地址和端口号
addrlen:结构体的长度
返回值:
成功返回0
失败,返回-1并设置错误码
第二参数const struct sockaddr *my_addr
struct sockaddr {
sa_family_t sa_family; 2个字节
char sa_data[14]; 14个字节
}
问题:
赋值时IP地址和端口号哪个在前哪个在后不确定
IP地址和端口号只占据6个字节,还有8个字节怎么填充
因此选用同族结构体
struct sockaddr_in{
sa_family_t sin_family; //地址族
uint16_t sin_port; //端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //预留未使用,自动填充0
};
struct in_addr{
In_addr_t s_addr; //32位IPv4地址
};1>注意端口大小端序转换的问题
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 32位
uint16_t htons(uint16_t hostshort); 16位
以上小端序转大端序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
大端序转回小端序2>注意IP格式转换
#include <netinet/in.h>
in_addr_t inet_addr(const char *cp);
将点分十进制的IP地址转换为网络二进制
char *inet_ntoa(struct in_addr in);
将网络二进制转回点分十进制
3.监听 (listen)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
保护服务器,限制同一瞬间最大的客户端连接数量
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
backlog:最大的客户端连接数量
返回值:
成功返回0
失败,返回-1并设置错误码
4.等待客户端连接 (等待意味着“阻塞” accept)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
等待客户端连接,第二参能保存对方的IP地址和端口号,不需要保存对方设置NULL
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
addr:用来保存客户端信息的结构体
addrlen:结构体长度。
返回值:
成功返回与客户端通信的文件描述符,与socket函数类似
失败,返回-1并设置错误码
客户端:
为了演示效果明显,我们开始写客户端框架
1>创建socket套接字
2>声明服务器所在的IP地址和端口号
3>主动连接服务器
4>数据收/发
5>关闭文件描述符
1.创建socket套接字与服务器相似
2.声明服务器所在的IP地址和端口号
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = inet_addr("192.168.10.5");
注意声明都是别人的,与你无关
3.主动连接服务器 (connect)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
功能:
主动连接服务器,第二参能保存对方的IP地址和端口号,不需要设置NULL
参数:
sockfd:这个是socket创建出来的具有网络属性的文件描述符
addr:用来连接服务器的结构体
addrlen:结构体长度,一般用sizeof()。
返回值:
成功返回0
失败,返回-1并设置错误码
4.数据发送(send)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
数据发送
参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送缓冲区长度
flags:默认为0,表示阻塞
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
5.数据接收(recv)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd,void *buf, size_t len, int flags);
功能:
数据接收
参数:
sockfd:套接字文件描述符
buf:接收缓冲区
len:接收缓冲区长度
flags:默认为0,表示阻塞
返回值:
>0: 返回接收的字节数
=0: 客户端异常退出(CTRL+C)
<0: 失败:返回-1,并设置errno
四、服务器和客户端代码实例
//服务器代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(void)
{//1>创建socket套接字int serfd = socket(AF_INET,SOCK_STREAM,0);//1.选IPv4,2选TCP,3默认0if(serfd<0) //错误判断{perror("socket");return -1;}printf("创建出的socket的值为%d\n",serfd);//2>绑定自己的IP地址和端口号struct sockaddr_in my_addr;my_addr.sin_family = AF_INET;//IPv4my_addr.sin_port = htons(8888);//将linux小端转系统的大端my_addr.sin_addr.s_addr =inet_addr("192.168.10.5");//注意将IP地址格式转为网络二进制,还有记得改成自己的linuxIP地址int ret;ret = bind(serfd,(struct sockaddr *)&my_addr,sizeof(my_addr));//第二参将同族结构体强转为函数需要的结构体类型if(ret<0) //错误判断{perror("bind");return -1;}printf("serfd网络属性已成功配置!\n");//3>监听ret = listen(serfd,8);if(ret<0) //错误判断{perror("listen");return -1;}printf("监听已启动,保护服务器中^-^\n");//4>等待客户端连接 阻塞int clifd = accept(serfd,NULL,NULL);//accept接触阻塞后将产生一个与客户端通信的文件描述符if(clifd<0) //错误判断{perror("accept");return -1;}printf("创建出与客户端通信的文件描述符值为%d\n",clifd);printf("有客户连接进来了!\n");//5>数据的接收char buf[30];while(1){
#if 0bzero(buf,sizeof(buf));ret = recv(clifd,buf,sizeof(buf),0);//阻塞printf("客户端说:%s\n",buf);
#endifbzero(buf,sizeof(buf));ret = recv(clifd,buf,sizeof(buf),0);//阻塞if(ret<0){perror("recv");return -1;}else if(ret == 0){printf("客户带着小姨子跑了!\n");return -1;}else{printf("客户端说:%s\n",buf);}}//6>关闭套接字close(serfd);close(clifd);return 0;
}
//客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(void)
{//1>创建socket套接字int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket");return -1;}printf("创建出的socket的值为%d\n",sockfd);//2>声明"服务器"所在的IP地址和端口号struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(8888);server.sin_addr.s_addr = inet_addr("192.168.10.5");printf("已经声明服务器的IP地址和端口号!\n");//3>主动连接服务器int ret = connect(sockfd,(struct sockaddr*)&server,sizeof(server));if(ret<0){perror("connect");return -1;}printf("连接服务器成功,请进行操作!\n");//4>数据发送char buf[30];while(1){bzero(buf,sizeof(buf));scanf("%s",buf);send(sockfd,buf,strlen(buf),0); }//5>关闭文件描述符close(sockfd);return 0;
}
总结
本篇文章针对C/C++ 网络编程进行详细讲解,希望能够帮到大家!
以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王!
希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们!
相关文章:
C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
目录 前言 一、网络的含义与构成 含义: 构成: 二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构 3>数据经过体系结构,怎么封装? 4>端口号 5>大小端序 6>TCP/UDP传输层的协议 三、系统函数API学习框…...
chrome Driver 使用教程
ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability](Chrome for Testing availability)...
目标检测YOLO实战应用案例100讲-面向恶劣环境下的多模态 行人识别
目录 前言 国内外研究现状 可见光行人目标识别 红外行人目标识别...

react-router-dom v6版本实现Tabs路由缓存切换
目录 文章目录 概要 效果 完整代码 概要 摆了半年摊,好久没写代码了,今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大,但了解react的机制和rea…...

ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?
本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件,拖到ArcGIS后却出现“未知的空间参考:添加的数据源缺少空间参考信息 不能投影”的提示,如下图所示: 这种情况就…...

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…...

离线语音与IoT结合:智能家居发展新增长点
离线语音控制和物联网(IoT)相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理,而不需要依赖云服务器进行处理。IoT是指借助网络,通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…...

STM32MP135和STM32MP157的区别
本文介绍了STMicroelectronics公司推出的两款多核处理器STM32MP135和STM32MP157之间的区别,包括主频、集成硬件模块数量、内存大小和电压调节模块等方面。 STMicroelectronics是一家领先的半导体解决方案提供商,在嵌入式系统领域有着丰富的经验。他们…...

微信小程序文本横向无缝滚动
背景: 微信小程序中列表宽度不够长,其中某字段显示不完整,因此要使其自动滚动。 (最初看网上很多用定时器实现,但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表,…...

Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值
var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…...

镜头边缘的解析力通常比中心差很多的原因是什么?
1、问题背景 之前有总结过一篇文章,“ 相机出图画面一半清晰,一半模糊的原因是什么?”里面有描述到关于镜头边缘的清晰度通常比中心要差的原因主要是光的折射导致的,有读者指出问题,折射率是和传输介质相关࿰…...

“控制情绪,理性交流”刍议
今天,本“人民体验官”还是回避推广人民日报官方微博文化产品《走出低谷期的9个习惯》。 截图:来源“人民体验官”推广平台 之前,由于笔者读过《人民日报》曾经发表过的关于“学会管理情绪 ”的文章,对文章中这些观点深表认同&…...
UI基础之插画分类优漫动游
一、UI插画分类 UI基础之插画分类 1.扁平插画 优点∶快速上手,同时画风简洁明了,突出重 点,能够快速的让用户了解内容 缺点:过于简洁,运用的也比较普遍,视觉上难以让用户记住 2.肌理插…...

Vue 3.0中Treeshaking特性是什么?
一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination 简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码 如果把代码打包比作制作蛋糕,传统的方式是把鸡…...
SQL union all的使用
背景: 公司业务开发需要将两个取出两个相同表结构(原料、辅料)的数据,组成一个新视图,使用了UNION ALL SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GOCREATE view vw_rawmaterial_ny_list as ( select id,ccode,cc…...

docker 安装 Centos7
1. 从docker 安装 Centos7 查看有哪些 centos7 系统:docker search centos72. 安装 centos7 docker pull docker.io/ansible/centos7-ansible3.使用镜像创建容器 docker run -itd -p 8022:22 --namevm01 -v /bodata:/bodata -h vm01 --privilegedtrue 688353a31…...

Kubernetes技术与架构-Ingress
Ingress是一个流量网关,其根据配置的URI路径路由规则,为运行在Kubernetes集群中的Service分发流量,从系统架构设计的角度看,Ingress位于Service的上层,本文主要描述Ingress的基本使用方式。 如上所示,clien…...

基于Java的文物管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
uniapp图片加水印
1、uniapp加水印 1.1、创建画布容器 <canvas class"watermark-canvas" id"watermark-canvas" canvas-id"watermark-canvas":style"{ width: canvasWidth, height: canvasHeight }" /> 1.2、获取水印内容 async getLocation(…...

react中JSX基础与useState的基本使用 + 评论显示删除需求案例
参考视频:https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p3&spm_id_frompageDriver&vd_source5c584bd3b474d579d0bbbffdf0437c70 如果没有安装create-react-app需要先全局安装 命令:npm i -g create-react-app1.快速搭建开发环境 create-re…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...