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

TCP Socket编程

最基本的Socket编程

想客户端和服务器能在网络中通信,就得使用 Socket 编程,它可以进行跨主机间通信。在创建Socket时可以选择传输层使用TCP还是UDP。相对于TCP来说,UDP更为简单,下面以TCP为例。

TCP服务端要先建立起来,等待客户端的连接到来,然后建立起连接。

1、服务端首先调用socket()函数,创建套接字,

2、接着调用bind()函数来绑定IP和地址和端口号。

绑定 IP 地址:一台机器是可以有多个网卡的,每个网卡都有对应的IP 地址,只有当绑定了目标网卡时,内核在收到该网卡上的数据包,才会发给我们。

绑定端口:当内核收到 TCP 报文,通过 TCP 头里面的端口号,来找到我们的应用程序,然后把数据传递给对应端口号的程序。

3、调用listen()函数将创建的套接字设为监听状态,刚刚创建的套接字为监听套接字,即这个套接字只是用来监视有没有客户端发起新连接,并不进行真正的通信。

4、服务端进入了监听状态后,通过调用accept()函数,来从内核获取客户端的连接,如果没有客户端连接,则会阻塞等待客户端连接的到来。

相关代码如下:

            // 1.创建套接字_listensock = socket(AF_INET, SOCK_STREAM, 0);if(_listensock < 0){exit(2);}cout << "create socket success" << endl;// 2.绑定struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY;int n_bind = bind(_listensock, (struct sockaddr*)&local, sizeof(local));if(n_bind < 0){exit(3);}cout << "bind socket success" << endl;// 3.监听,设置套接字socket状态为监听状态int n_listen = listen(_listensock, 5);if(n_listen < 0){exit(4);}cout << "listen socket success" << endl;

接下来就是TCP客户端:客户端创建socket,然后调用connect()函数发起连接,并且在connect的时候要指明服务器的IP和端口号;当发起connect后,就开始三次握手过程建立连接,成功后会返回一个文件描述符,是和服务端建立好连接的,然后双方就能进行通信了。

相关代码如下:

        void InitClient(){// 1. 创建socket_sock = socket(AF_INET, SOCK_STREAM, 0);if(_sock < 0){exit(2);}// 2. tcp的客户端要不要bind?要的! 要不要显示的bind?不要!这里尤其是client port要让OS自定随机指定!// 3. 要不要listen?不要!// 4. 要不要accept? 不要!// 5. 要什么呢??要发起链接!}void Start(){// 发起链接,使用connect// 首先要知道要链接的服务端的ip和portstruct sockaddr_in server;bzero(&server, sizeof(server));server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(_serverip.c_str());server.sin_port = htons(_serverport);int n_connect = connect(_sock, (struct sockaddr*)&server, sizeof(server));if(n_connect < 0){cout << "socket connect error" << endl;}else{string message;while(true){cout << "Enter# ";getline(cin, message);write(_sock, message.c_str(), message.size());char buffer[1024];int n = read(_sock, buffer, sizeof(buffer)-1);if(n > 0){//目前我们把读到的数据当成字符串, 截止目前buffer[n] = 0;cout << "Server回显# " << buffer << endl;}else{break; }}}}

在 TCP 连接的过程中,服务器的内核实际上为每个 Socket 维护了两个队列:
一个是尚未完全建立起连接的队列,称为 TCP 半连接队列,这个队列都是没有完成三次握手的连接,此时服务端处于syn_rcvd 的状态;
一个是已经建立连接的队列,称为 TCP 全连接队列,这个队列都是完成了三次握手的连接,此时服务端处于 established 状态;
当 TCP 全连接队列不为空后,服务端的 accept()函数,就会从内核中的 TCP 全连接队列里拿出一个已经完成连接的 socket 返回应用程序,后续数据传输都用这个 socket。

需要注意的是:监听连接到来的socket和真正通信的socket是不同的

连接建立后,客户端和服务端就开始相互传输数据了,双方都可以通过 read()和 write()函数来读写
数据。

上面所描述的TCP Socket是最简单的,基本只能用来一对一通信,其使用的是同步阻塞的方式,当服务端在还没处理完一个客户端的网络 I/0 时,其他客户端是无法与服务端连接的。但是一个服务器只服务一个客户,这样就太浪费资源了,所以要进行改进:

多进程模型:

服务器的主进程负责监听客户的连接,一旦与客户端连接完成,这时当前进程就通过 fork()函数创建一个子进程,实际上就把父进程所有相关的东西都复制一份,包括文件描述符、内存地址空间、执行的代码等。
因为子进程会复制父进程的文件描述符,于是就可以直接使用已连接 Socket和客户端通信了,可以发现,子进程不需要关心监听 Socket,只需要关心已连接 Socket;父进程则相反,将客户服务交给子进程来处理,因此父进程不需要关心已连接 Socket,只需要关心监听 Socket。

这里需要注意的是要回收子进程,否则会造成僵尸进程的问题,最终导致资源泄漏的问题。这种用多个进程来应付多个客户端的方式,当客户端数量很多时,肯定是扛不住的,因为每产生一个进程,必会占据一定的系统资源,而且进程间上下文切换代价也不小,性能会有很大的影响。所以又有了多线程版本:

多线程模型:

在Linux中线程是更加轻量化的进程,是CPU调度的基本单位,并且线程切换相比于进程切换代价更小,性能会更好,当服务器与客户端 TCP 完成连接后,通过 pthread create()函数创建线程,然后将已连接 Socket的文件描述符传递给线程函数,接着在线程里和客户端进行通信,从而达到并发处理的目的。
如果每来一个连接就创建一个线程,线程运行完后,还得操作系统还得销毁线程,虽说线程切换的上写文开销不大,但是如果频繁创建和销毁线程,系统开销也是不小的。
那么,我们可以使用线程池的方式来避免线程的频繁创建和销毁,所谓的线程池,就是提前创建若干个线程,这样当由新连接建立时,将这个已连接的 Socket 放入到一个队列里,然后线程池里的线程负责从队列中取出已连接 Socket 进行处理。

相关代码如下:

        void Start(){// 初始化线程池并启动线程池ThreadPool<Task>::getInstance()->run();cout << "Thread init success" << endl;// 4.acceptwhile(1){struct sockaddr_in peer;socklen_t len = sizeof(peer);// accept成功返回一个文件描述符,用来和Client通信,而这里的_sock是用来监听链接到来,获取新链接的。int sock = accept(_listensock, (struct sockaddr*)&peer, &len);if(sock < 0){continue;}cout << "accept a new link success, get new sock: " <<  sock << endl;// 5.这里就是一个sock,未来通信我们就用这个sock,面向字节流的,后续全部都是文件操作!// version 1//serviceIO(sock);//close(sock); //对一个已经使用完毕的sock,我们要关闭这个sock,要不然会导致,文件描述符泄漏// version 2 多进程// pid_t id = fork();// if(id == 0) // 子进程// {//     // 子进程会有自己独立的进程地址空间//     close(_listensock);//     if(fork() > 0) exit(0);//     serviceIO(sock);//     close(sock);//     exit(0);// }// close(sock);// // 父进程// // 子进程结束需要父进程来回收,避免僵尸进程// pid_t ret = waitpid(id, nullptr, 0);// if(ret>0)// {//     std::cout << "waitsuccess: " << ret << std::endl;// }// version 3 多线程// pthread_t tid;// ThreadData* td = new ThreadData(this, sock);// pthread_create(&tid, nullptr, threadRoutine, td);// version 4 线程池ThreadPool<Task>::getInstance()->push(Task(sock, serviceIO));}}

上面的代码是部分代码,具体的代码可以通过下面链接查看:

Linux: Linux学习 - Gitee.com

相关文章:

TCP Socket编程

最基本的Socket编程 想客户端和服务器能在网络中通信&#xff0c;就得使用 Socket 编程&#xff0c;它可以进行跨主机间通信。在创建Socket时可以选择传输层使用TCP还是UDP。相对于TCP来说&#xff0c;UDP更为简单&#xff0c;下面以TCP为例。 TCP服务端要先建立起来&#xf…...

[CLS] 向量是 BERT 类模型中一个特别重要的输出向量,它代表整个句子或文本的全局语义信息

[CLS] 向量是 BERT 类模型中一个特别重要的输出向量&#xff0c;它代表整个句子或文本的全局语义信息。 ✅ 什么是 [CLS] 在 BERT 模型中&#xff0c;每条输入前会加一个特殊的 token&#xff1a;[CLS]&#xff08;classification 的缩写&#xff09;。这个 token 没有具体语义…...

47.电压跌落与瞬时中断干扰的防护改善措施

电压跌落与瞬时中断干扰的防护改善措施 1. 电压跌落与瞬时中断的影响机理2. 解决措施 1. 电压跌落与瞬时中断的影响机理 跌落发生的常见场景如下&#xff1a; &#xff08;1&#xff09;电源插头接触不良&#xff0c;瞬态中断即刻恢复&#xff1b; &#xff08;2&#xff09;电…...

LeetCode热题100 两数之和

目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;…...

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术 定义&#xff1a;SOCKET - IO复用技术是一种高效处理多个套接字&#xff08;socket&#xff09;的手段&#xff0c;能让单个线程同时监听多个文件描述符&#xff08;如套接字&#xff09;上的I/O事件&#xff08;像可读、可写、异常&#xff09;&#x…...

【数据结构】子串、前缀

子串 (Substring) 字符串中连续的一段字符序列&#xff0c;例如 "abc" 是 "abcd" 的子串。 特点&#xff1a;必须连续&#xff0c;顺序不可改变。 子序列 (Subsequence) 字符串中不连续但保持顺序的字符序列&#xff0c;例如 "acd" 是 "…...

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…...

leetcode 2918. 数组的最小相等和 中等

给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数&#xff0c;并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 &#xff0c;如果无法使两数组相等&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xf…...

RT-Thread 深入系列 Part 5:物联网与网络应用实战

摘要 本文聚焦 RT-Thread 在物联网场景下的网络应用实战,从网络协议栈集成到 MQTT/CoAP/HTTP 客户端实现,再到 mbedTLS 安全通信与 OTA 升级,最后以阿里云、腾讯云和 OneNet 平台对接为案例,完整呈现端到端的物联网解决方案落地过程。 目录 网络协议栈:LWIP 与网络设备 MQ…...

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU&#xff1a;简化的生成式 AI UI界面开源程序&#xff0c;一个非常简单的 AI 图像生成器 UI 界面&#xff0c;使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…...

Linux系统入门第十二章 --Shell编程之正则表达式

一、正则表达式 之前学习了 Shell 脚本的基础用法&#xff0c;已经可以利用条件判断、循环等语句编辑 Shell脚本。接下来我们将开始介绍一个很重要的概念-正则表达式(RegularExpression&#xff0c;RE) 1.正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常…...

Ubuntu22.04怎么退出Emergency Mode(紧急模式)

1.使用nano /etc/fstab命令进入fstab文件下&#xff1b; 2.将挂载项首行加#注释掉&#xff0c;修改完之后使用ctrlX退出; 3.重启即可退出紧急模式&#xff01;...

IC ATE集成电路测试学习——开尔文连接

首先&#xff0c;我们先了解一下ATE在测试时的PMU测量原理。 驱动线路和感知线路 为了提升 PMU 驱动电压的精确度&#xff0c;常使用 4 条线路的结构&#xff1a;两条驱动线路传输电流&#xff0c;另两条感知线路监测我们感兴趣的点&#xff08;通常是DUT&#xff09;的电压。…...

Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程

Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程 摘要 本技术指南针对Ubuntu与Windows双系统用户&#xff0c;系统阐述NTFS分区挂载的技术原理与操作流程。通过规范的技术说明和专业的故障排除方案&#xff0c;帮助用户在异构操作系统环境下实现文件系统的无缝访问&#x…...

C++学习-入门到精通-【6】指针

C学习-入门到精通-【6】指针 指针 C学习-入门到精通-【6】指针一、指针的初始化二、指针运算符地址运算符&间接引用运算符* 三、使用指针的按引用传递方式四、内置数组标准库函数的begin和end内置数组的局限性 五、使用const修饰指针 一、指针的初始化 指针在声明或赋值时…...

数据集-目标检测系列- 冥想 检测数据集 close_eye>> DataBall

数据集-目标检测系列- 冥想 检测数据集 close * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-…...

CoAP 协议介绍及应用场景

CoAP 协议&#xff0c;即受限应用协议&#xff08;Constrained Application Protocol&#xff09;&#xff0c;是专为资源受限的设备和网络设计的一种应用层协议 &#xff0c;旨在让小型、低功耗的设备能够接入物联网&#xff08;IoT&#xff09;&#xff0c;并以最小的资源与更…...

【并发编程】基于 Redis 手写分布式锁

目录 一、基于 Redis 演示超卖现象 1.1 Redis 超卖现象 1.2 超卖现象解决方案 二、Redis 的乐观锁机制 2.1 原生客户端演示 2.2 业务代码实现 三、单机部署 Redis 实现分布式锁 3.1 分布式锁的演变和升级 3.2 setnx 实现分布式锁 3.2.1 递归调用实现分布式锁 3.2.2 循…...

adb命令查询不到设备?

一、背景 -----以鸿蒙系统为例&#xff0c;其他系统类似--- 1、确保adb在电脑上成功安装 2 、连接手机 adb devices 列表中无显示设备 二、解决 1. 手机打开开发者模式 手机型号不同&#xff0c;所以选项不一样 2. 一般流程是&#xff1a;设置--搜索--“开发”--会出现开…...

JavaScript 数组去重:11 种方法对比与实战指南

文章目录 前言一、使用 Set 数据结构二、使用 filter indexOf三、使用 reduce 累加器四、双重 for 循环五、利用对象属性唯一性六、先排序后去重七、使用 Map 数据结构八、使用 includes 方法九、优化处理 NaN 的 filter 方法十、利用 findIndex十一.利用Set和展开运算符处理多…...

SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析

文章目录 一、引言二、YOLOv8 损失函数概述三、SlideLoss 详解&#xff08;一&#xff09;SlideLoss 的原理&#xff08;二&#xff09;SlideLoss 的代码实现 四、FocalLoss 分类损失函数详解&#xff08;一&#xff09;FocalLoss 的原理&#xff08;二&#xff09;FocalLoss 的…...

AI 驱动数据库交互技术路线详解:角色、提示词工程与输入输出分析

引言 在人工智能与数据库深度融合的趋势下&#xff0c;理解AI在数据库交互流程中的具体角色、提示词工程的运用以及各步骤的输入输出情况&#xff0c;对于把握这一先进技术路线至关重要。本文将对其展开详细剖析。 一、AI 在数据库交互流程中的角色 &#xff08;一&#xff0…...

Jmeter中的BeanShell如何使用?

在JMeter中&#xff0c;BeanShell 是一种基于Java语法的脚本工具&#xff0c;可以通过编写脚本实现动态逻辑处理、变量操作、条件判断等功能。以下是BeanShell的详细使用方法和常见场景示例&#xff1a; 1. BeanShell组件类型 JMeter提供多种BeanShell组件&#xff0c;根据场…...

JDBC工具类的三个版本

一、JDBC连接数据库的7个步骤 1、加载驱动 2、获取连接 3、编写sql 4、获取执行sql的stmt对象 有两种 stmt&#xff08;存在sql注入问题 字符串拼接&#xff09; pstmt&#xff08;预编译可以防止sql注入&#xff09; 5、执行sql 拿到结果集 6、遍历结果集 7、关闭资源…...

安达发|制药车间生产计划准备性的关键影响因素及优化策略研究

在高度规范的制药行业&#xff0c;生产计划的准备性直接影响企业的运营效率和合规水平。根据FDA统计&#xff0c;2024年因生产计划不当导致的药品短缺案例增加了23%&#xff0c;暴露出制药企业在生产计划管理方面的系统性挑战。本文将从设备、物料、人员、环境、法规五个维度&a…...

独立按键控制LED

目录 1.独立按键介绍 2.原理图 3.C51数据运输 解释&#xff1a;<< >> ​编辑 解释&#xff1a;& | 解释&#xff1a;^ ~ ​编辑 4.C51基本语句 5.按键的跳动 6.独立按键控制LED亮灭代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1…...

【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用

目录 一、getters 二、 mapState 三、 mapGetters 四、 mapMutations 五、 mapActions 学到这儿来个小总结&#xff1a;四个map方法的使用 总结不易~ 本章节对我有很大的收获&#xff0c; 希望对你也是&#xff01;&#xff01;&#xff01; 本节素材已上传至Gitee&…...

小程序初始化加载时间优化 步骤思考与总结

回想起来&#xff0c;正确的小程序初始加载时间优化步骤应该为&#xff1a; 一、梳理小程序初始化的步骤&#xff0c;以用户点击小程序为开始&#xff08;尽可能靠近&#xff09;&#xff0c;以页面渲染出来的时刻为结束—也就是用户感知到的时间。 二、页面渲染时&#xff0…...

前端弹性布局:用Flexbox构建现代网页的魔法指南

引言&#xff1a;布局的进化史 在网页设计的黑暗时代&#xff08;2010年前&#xff09;&#xff0c;开发者们用float、position和inline-block这些原始工具进行布局&#xff0c;就像用石器时代的工具建造摩天大楼。直到2012年W3C正式推出Flexbox规范&#xff0c;前端世界终于迎…...

Python基于Django的高校教室管理系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

【金仓数据库征文】_金仓数据库在金融行业的两地三中心容灾架构实践

金仓数据库在金融行业的两地三中心容灾架构实践 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 引言 随着国家对信息技术应用创新&#xff0…...

利用多AI协作实现AI编辑器高效开发:创新架构与实践基本构想

在当今快速发展的科技领域&#xff0c;AI技术正以前所未有的速度重塑软件开发的流程和模式。传统的软件开发过程往往需要不同专业人员协同合作&#xff0c;从需求分析到产品设计&#xff0c;再到技术实现&#xff0c;每个环节都需要耗费大量的时间和人力。然而&#xff0c;随着…...

【字节拥抱开源】字节豆包团队开源首发 Seed-Coder 大模型

我们非常高兴地向大家介绍 Seed-Coder&#xff0c;它是一个功能强大、透明、参数高效的 8B 级开源代码模型系列&#xff0c;包括基础变体、指导变体和推理变体。Seed-Coder 通过以下亮点促进开放代码模型的发展。 以模型为中心&#xff1a;Seed-Coder主要利用大语言模型&#…...

C++GO语言微服务之gorm框架操作MySQL

目录 01 01-gorm介绍 02 02-MySQL操作回顾 03 03-gorm创建表 04 04-MySQL的init函数说明 05 05-gorm框架提供的MySQL连接池 06 06-gorm插入数据 07 07-gorm查询数据 08 08-gorm更新数据 09 09-gorm软删除-创建表 10 10-gorm软删除-实现 11 10-MySQL的8小时时区问题 …...

Webug4.0靶场通关笔记-靶场搭建方法(3种方法)

目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 &#xff08;1&#xff09;安装PHPStudy &#xff08;2&#xff09;WeBug4.0靶场源码 &#xff08;3&#xff09;安装Navicat &#xff…...

HTTP/3展望、我应该迁移到HTTP/2吗

1. HTTP/3展望 HTTP/3 基于 QUIC 协议&#xff0c;完全解决了“队头阻塞”问题&#xff0c;弱网环境下的表现会优于 HTTP/2&#xff1b;QUIC 是一个新的传输层协议&#xff0c;建立在 UDP 之上&#xff0c;实现了可靠传输&#xff1b;QUIC 内含了 TLS1.3&#xff0c;只能加密通…...

【Linux基础】系统监控和进程管理指令

目录 ps命令 top命令 kill命令 killall命令 1.1 命令介绍 1.2 命令格式 1.3 常用选项 1.4 示例 1.4.1 交互模式确认 1.4.2 指定信号 shutdown命令 ps命令 作用&#xff1a;查看当前进程信息。 常用选项&#xff1a; 作用 -e 显示所有进程&#xff0c;包括其他用户…...

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …...

无法更新Google Chrome的解决问题

解决问题&#xff1a;原文链接&#xff1a;【百分百成功】Window 10 Google Chrome无法启动更新检查&#xff08;错误代码为1&#xff1a;0x80004005&#xff09; google谷歌chrome浏览器无法更新Chrome无法更新至最新版本&#xff1f; 下载了 就是更新Google Chrome了...

CenOS7切换使用界面

永久切换 在开始修改之前&#xff0c;我们首先需要查看当前的启动模式。可以通过以下命令来实现&#xff1a; systemctl get-default执行此命令后&#xff0c;系统会返回当前的默认启动模式&#xff0c;例如graphical.target表示当前默认启动为图形界面模式。 获取root权限&…...

# YOLOv3:深度学习中的目标检测利器

YOLOv3&#xff1a;深度学习中的目标检测利器 引言 在计算机视觉领域&#xff0c;目标检测是一项核心任务&#xff0c;它涉及到识别图像或视频中的物体&#xff0c;并确定它们的位置。随着深度学习技术的快速发展&#xff0c;目标检测算法也在不断进步。YOLO&#xff08;You …...

2025数维杯数学建模A题完整参考论文(共36页)(含模型、可运行代码、数据)

2025数维杯数学建模A题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、符号定义与说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2模型…...

在 Flink + Kafka 实时数仓中,如何确保端到端的 Exactly-Once

在 Flink Kafka 构建实时数仓时&#xff0c;确保端到端的 Exactly-Once&#xff08;精确一次&#xff09; 需要从 数据消费&#xff08;Source&#xff09;、处理&#xff08;Processing&#xff09;、写入&#xff08;Sink&#xff09; 三个阶段协同设计&#xff0c;结合 Fli…...

Python数据分析

目录 一、数据分析的核心流程 &#xff08;一&#xff09;明确数据分析目标 &#xff08;二&#xff09;数据收集 &#xff08;三&#xff09;数据清洗 1. 处理缺失值 2. 去除重复值 3. 修正错误值和异常值 &#xff08;四&#xff09;数据探索与可视化 1. 计算描述性…...

Java单例模式总结

说明&#xff1a;单例模式的核心是确保一个类只有一个实例&#xff0c;并提供全局访问点。饿汉式和懒汉式是两种常见的实现方式 一、饿汉式和懒汉式 1. 饿汉式&#xff08;Eager Initialization&#xff09; public class EagerSingleton {// 类加载时直接初始化实例private…...

《P7167 [eJOI 2020] Fountain (Day1)》

题目描述 大家都知道喷泉吧&#xff1f;现在有一个喷泉由 N 个圆盘组成&#xff0c;从上到下以此编号为 1∼N&#xff0c;第 i 个喷泉的直径为 Di​&#xff0c;容量为 Ci​&#xff0c;当一个圆盘里的水大于了这个圆盘的容量&#xff0c;那么水就会溢出往下流&#xff0c;直到…...

Pycharm(二十)张量的运算与操作

一、张量的数据类型转换 1.演示data.type(trch.DoubleTensor) #1.创建张量对象 [6 6 6;6 6 6] datatorch.full([2,3],6) print(data.dtype)#默认为torch.int64(LongTensor) #2.转化为double类型 datadata.type(torch.DoubleTensor) print(data.dtype) #3.转换成int类型 datad…...

JVM之内存管理(二)

部分内容来源&#xff1a;JavaGuide二哥Java 说⼀下 JDK1.6、1.7、1.8 内存区域的变化&#xff1f; JDK1.6、1.7/1.8 内存区域发⽣了变化&#xff0c;主要体现在⽅法区的实现&#xff1a; JDK1.6 常量池在方法区 JDK1.7 JDK1.6 使⽤永久代实现⽅法区&#xff1a;JDK1.7 时发…...

蓝桥杯嵌入式第十一届省赛真题

&#xff08;一&#xff09;题目 首先要知道P37对应的CubeMx上面的引脚是PB15,给PB15设置成ADC采集。使用到的PA6和PA7的端口要进行定时器配置 100Hz80 000 000/800 *1000 200Hz80 000 000/400 *1000 ADC采集只需要选择好adc1、adc2 再选择好它的通道就可以了&#xff0c;不…...

LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻译与解读

LLMs之ChatGPT&#xff1a;《Connecting GitHub to ChatGPT deep research》翻译与解读 导读&#xff1a;这篇OpenAI帮助文档全面介绍了将GitHub连接到ChatGPT进行深度代码研究的方法、优势和注意事项。通过连接GitHub&#xff0c;用户可以充分利用ChatGPT强大的代码理解和生成…...