Linux网络编程:套接字编程
1.Socket套接字编程
1.1.什么是socket套接字编程
Socket套接字编程 是一种基于网络层和传输层网络通信方式,它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件,它提供了不同主机间的进程间通信端点的抽象。一个Socket就是一个通信端点,它提供了应用程序访问网络通信协议(如TCP/IP)的接口。并且Socket编程基于客户端(Client)和服务器端(Server)进行全双工通信!!!
- 客户端:通常指的是发起连接请求的一方,它使用Socket API创建一个Socket对象,并指定要连接的服务器地址和端口号,然后向服务器发送连接请求。连接建立后,客户端就可以通过Socket发送和接收数据了。
- 服务器端:则是监听来自客户端的连接请求的一方。服务器端也使用Socket API创建一个Socket对象,并绑定到一个指定的地址和端口号上,然后开始监听来自客户端的连接请求。当有客户端连接时,服务器端会接受这个连接,并创建一个新的Socket对象来与这个客户端进行通信。
简单来说,Socket编程就是使用Socket API(应用程序接口)来编写网络应用程序。这些网络应用程序可以是客户端,也可以是服务器端,它们通过Socket进行数据的发送和接收。
1.2.如何进行socket套接字编程
首先socket套接字编程是基于TCP、IP四层网络协议栈实现的,而在传输层协议中UDP协议是无连接、面向数据报的,TCP协议是有链接、面向字节流的,因此系统维护了两套Socket套接字编程接口,给UDP场景和TCP场景使用!!!
1.2.1.UDP的套接字编程
// UDP服务器
{int port; // 服务器开放的端口号int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); // 网络通信,UDP套接字// 填充sockaddr结构体对象struct sockaddr_in local;bzero(&local, sizeof(local)); // 初始化结构体local.sin_family = AF_INET; // 绑定网络通信local.sin_port = htons(); // 绑定端口local.sin_addr.s_addr = INADDR_ANY; // 允许所有外来ip访问// 绑定指定网络信息和指定的文件系统int n = ::bind(sock_fd, (struct sockaddr *)&local, sizeof(local));// 获取客户端信息char buff_r[1024];sockaddr_in peer;socklen_t len = sizeof(peer);ssize_t n = recvfrom(sock_fd, buff_r, sizeof(buff_r) - 1, 0, (struct sockaddr *)&peer, &len);// 给客户端发送信息std::string buffer;ssize_t m = sendto(sock_fd, buffer.c_str(), buffer.size(), 0, (struct sockaddr *)&peer, &len);
}
服务器进行套接字编程流程:
- 通过socket函数获取套接字,其中SOCK_DGRAM对应UDP协议
- 构建一个sockaddr_in对象,并绑定端口和设置允许任意的IP地址访问服务器
- 接着通过bind函数显性绑定套接字和sockaddr_in对象
- 接下来就可以和客户端进行IO通信了!!!
/ UDP客户端
{int port_server; // 链接服务器的端口号int ip_server; // 链接服务器的端口号int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); // 网络通信,UDP套接字struct sockaddr_in server;bzero(&server, sizeof(server)); // 初始化结构体server.sin_family = AF_INET; // 设置为网络协议server.sin_port = htons(port_server); // 绑定服务器端口server.sin_addr.s_addr = inet_addr(ip_server.c_str()); // 实现ip的动态绑定// 客户端不用通过bind函数显性绑定套接字// 因为服务器先启动,已经获得了套接字,只要绑定服务器的ip和端口就能使用这个套接字// 向服务器发送信息std::string buffer;ssize_t n = sendto(sock_fd, buffer.c_str(), buffer.size(), 0, (struct sockaddr *)&server, sizeof(server));// 从服务端获取信息char buff_r[1024];struct sockaddr_in client;socklen_t len = sizeof(client);ssize_t m = recvfrom(sock_fd, buff_r, sizeof(buff_r) - 1, 0, (struct sockaddr *)&client, &len);
}
客户端进行套接字编程的流程:
- 通过socket函数获取套接字,其中SOCK_DGRAM对应UDP协议
- 绑定服务器端口和服务器ip地址
- 直接进行和服务器的IO通信
服务端和客户端Socket编程的异同
- 相同的是:都需要调用socket函数来获取套接字,设置网络协议为AF_INET和SOCK_DGRAM,并且需要设置sockaddr_in结构体,初始化这个结构体的内置变量。均共用一套IO的接口sendto和recvfrom。
- 不同的是:服务端的IP地址设置为INADDR_ANY,表示可以绑定多个IP地址,这也符合服务器需要和多台客户端进行IO的特性。另外服务端需要显性地绑定socket_fd(套接字文件描述符)和sockaddr_in(IPV4套接字结构)。而客户端需要绑定唯一一个服务器的IP,并且不需要显性的绑定socket_fd和sockaddr_in。
1.2.2.TCP套接字编程
TCP协议是面向连接的,所以与UDP套接字流程相比,除了绑定套接字,TCP需要在通信之前先建立连接,具体来说就是:服务器监听客户端发出链接请求请求,接着客户端发出connect请求,最终服务器接收请求,获取一个通信的套接字,最终完成链接的建立。接着再进行IO通信!!!
// TCP服务器
{// 创建监听套接字int listen_sock = socket(AF_INET, SOCK_STREAM, 0);// 定义并配置本地struct sockaddr_in local;bzero(&local, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY;int n = ::bind(listen_sock, (struct sockaddr *)&local, sizeof(local));// TCP是面向连接的,需要监听client的链接int m = listen(listen_sock, 5); // 对listen这个套接字进行监听是否完成链接,设置全连接队列为5// 获取连接struct sockaddr_in peer;socklen_t len = sizeof(peer);// accept返回的新的套接字(通信套接字)int sock_fd = accept(_listen_sock, (struct sockaddr *)&peer, &len); // 用于数据通信,accept未接收会阻塞(未完成通信)!!// 通过read、write函数进行IO通信std::string buffer;ssize_t m = write(sock_fd, buffer.c_str(), buffer.size());char buffer_read[1024];ssize_t n = read(sock_fd, buffer_read, sizeof(buffer_read));
}
TCP服务端套接字编程的流程:
- 创建监听的套接字,然后设置协议为AF_INET和SOCK_STREAM(TCP专用)
- 定义并配置套接字结构体,最后进行监听套接字和网络套接字的结构体绑定
- 进行监听(在此期间等待客户端的connect请求)
- 设置网络套接字来接收客户端的信息,并通过accept函数获取到新的通信套接字
- 进行通信IO
// TCP客户端
{// 创建套接字int sock_fd = socket(AF_INET, SOCK_STREAM, 0);// 绑定服务器struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(server_port);inet_pton(AF_INET, server_ip.c_str(), &server.sin_addr);// TCP链接服务器int n = connect(sock_fd, (struct sockaddr *)&server, sizeof(server));// 通过read、write函数进行IO通信std::string buffer;ssize_t m = write(sock_fd, buffer.c_str(), buffer.size());char buffer_read[1024];ssize_t n = read(sock_fd, buffer_read, sizeof(buffer_read));
}
TCP客户端套接字编程流程:
- 创建套接字,并将网络套接字结构体绑定到服务器
- 调用connect发起链接服务器的请求(此时处于服务端监听状态)
- 完成链接,进行IO通信
到了这里,我们已经知道如何用代码来构建UDP、TCP通信最基本的架构了,而TCP是面向连接的,这也体现在listen、connect、accept这三个函数中(跟三次握手紧密相关,但不等同)。
如图为TCP中服务端和客户端建立通信的过程。
2.理解Socket套接字编程结构
我们在1.2中学习了如何搭建Socket套接字编程的结构,但是我们还不知道什么是Socket、什么是sockaddr_in和为什么要将sockaddr_in类型强转为(struct sockaddr*)等等,所以在有了对Socket编程的使用理解的基础上,我们来讲一下原理!!!
2.1.网络字节序
我们知道主机的地址排布,也就是字节序是可能存在不同的,大端机的字节序排列为高地址,小端机的字节序排列为低地址,那么这样就会导致在网络通信时,字节序读取不一致导致数据不一致问题。
例如在大端机中,32位整数,0x12345678,地址排布为:78563412,小端机则表示为:12345678
所以为了统一字节序的读取,在套接字编程中需要对网络字节序进行规定,以大端字节序为网络字节序标准,进行读取。我们在回到我们的代码中:
local.sin_port = htons(port); // htons即为字节序转换函数
而这些htons函数为系统提供的转换字节序的接口函数!
#include <arpa/inet.h>//必须包含的头文件
// 主机序列转网络序列
uint32_t htonl(uint32_t hostlong);//将主机上unsigned int类型的数据转换成对应网络字节序
uint16_t htons(uint16_t hostshort);//将主机上unsigned short类型的数据转换成对应网络字节序
// 网络序列转主机序列
uint32_t ntohl(uint32_t netlong);//将从网络中读取的unsigned int类型的数据转换成当前计算机字节序
uint16_t ntohs(uint16_t netshort);//将从网络中读取的unsigned short类型的数据转换成当前计算机字节序
所以当我们在网络中获取了一些字节序数据,我们需要对他进行大端字节序的转换成符合本机的字节序列。
这里即为将网络获取的数据字节序转化为本机的数据字节序,而htons即为将本机的字节序数据转化为网络字节序(大端)
2.2.网络套接字结构体
我们之前在1.2.提及了一个新名称“网络套接字结构体”,而这个结构体用于标识网络通信的端点,包括IP地址、端口号和地址族等信息。
// 通用网络套接字结构
struct sockaddr
{__SOCKADDR_COMMON(sa_); /* Common data: address family and length. */char sa_data[14]; /* Address data. */
};// 网络套接字结构
struct sockaddr_in
{__SOCKADDR_COMMON(sin_);in_port_t sin_port; /* Port number. */struct in_addr sin_addr; /* Internet address. *//* Pad to size of `struct sockaddr'. */unsigned char sin_zero[sizeof(struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof(in_port_t) -sizeof(struct in_addr)];
};
如图:我们在网络进行IO通信时,就是传输这个通用结构体对象sockaddr,所以我们在1.2.中的代码中也经常看到类型转换为(struct sockaddr *)。而这里也可以看作是C语言实现的多态,其中sockaddr为基类、sockaddr_in和sockaddr_un为派生类。
3.文件+socket+系统+网络
66-2小时33分
相关文章:
Linux网络编程:套接字编程
1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式,它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件,它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…...
多电商账户为什么要用指纹浏览器?
随着电子商务的蓬勃发展,越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战,其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前,我们首先需要了解这两个工…...
用Rancher2.8.5部署K8s集群
参考:通过Rancher 2.7.5部署企业生产级K8s集群 新K8s集群的环境信息 Rancher1台,K8s集群6台(1台rancher,3台master,4台node)。 Name|lmage Name|IP Address|Flavor|Comment project-root-dev-rancher|Ro…...
未来已来,如何打造智慧养殖场?
近年来,国家出台了一系列扶持政策,以促进养殖行业高质量发展,推动行业转型升级。在国家政策和市场需求的双重驱动下,养殖行业正迎来前所未有的发展机遇。智慧养殖以其高效、智能和可持续的特点,正逐步取代传统养殖方式…...
代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
打卡Day7 1.454.四数相加II2.383. 赎金信3.15. 三数之和4.18. 四数之和 1.454.四数相加II 题目链接:四数相加II 文档讲解: 代码随想录 class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res 0;Map…...
Python和tkinter实现的字母记忆配对游戏
Python和tkinter实现的字母记忆配对游戏 因为这个小游戏用到了tkinter,先简要介绍一下它。tkinter是Python的标准GUI(图形用户界面)库,它提供了一种简单而强大的方式来创建图形界面应用程序。它提供了创建基本图形界面所需的所有工具,同时保…...
Leetcode Hot100之链表
1.相交链表 解题思路 快慢指针:分别求出两个链表的长度n1和n2,在长度较长的那个链表上,快指针先走n2 - n1,慢指针再出发,最后能相遇则链表相交 时间复杂度O(mn),空间复杂度O(1)代码# Definition for singl…...
5.9k!一款清新好用的后台管理系统!【送源码】
今天给大家分享的开源项目是一个优雅清新后台管理系统——Soybean Admin。 简介 官方是这样介绍这个项目的: Soybean Admin 使用的是Vue3作为前端框架,TypeScript作为开发语言,同时还整合了NaiveUI组件库,使得系统具有高可用性和…...
Vue-cli搭建项目----基础版
什么是Vue-cli 全称:Vue command line interface 是一个用于快速搭建Vue.js项目的标准工具,他简化了Vue.js应用的创建和管理过程,通过命令工具帮助开发者快速生成,配置和管理Vue项目. 主要功能 同一的目录结构本地调试热部署单元测试集成打包上线 具体操作 第一步创建项目:…...
python之__call__函数介绍
Python 中的 __call__ 方法是一种特殊的方法,它允许对象像函数一样被调用。当你创建一个对象并使用括号 () 调用它时,Python 会自动调用这个对象的 __call__ 方法。 1. 基本用法 下面是一个简单的例子: class MyClass:def __init__(self, value):self.value valued…...
【AI】生成式AI服务器最低配置
【背景】 考虑数据安全,又想用AI赋能企业内部的日常工作,答案只有一个,本地部署。 UI采用open-web-ui,模型用Ollama管理,在局域网做成SAAS服务。要组一个服务器,提供部门内部最多30个的API并发。以下为反复…...
2.Android逆向协议-了解常用的逆向工具
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:1.Android逆向协议-环境搭建 常用的工具:AndroidKiller、jadx、JEB、IDA AndroidKiller…...
大数据------额外软件、插件及技术------Linux(完整知识点汇总)
Linxu 不同领域的主流操作系统 桌面操作系统 WindowsMAac OSLinux 服务器端操作系统 UNIX(付费)LinuxWindows Server(付费) 移动设备操作系统 Android(基于Linux开源)IOS(不开源) 嵌…...
iOS 其他应用的文件如何在分享中使用自己的应用打开
废话少说 一、第一步:先配置好plist文件 右击info.plist如下图文件打开 根据自己需要配置支持的文件类型,也可使用property List中配置,一样的 其他的文件可是参考文档:System-Declared Uniform Type Identifiers 可复制的代码&am…...
【编译原理必考大题】 推导构建语法树,写出语法树的短语,简单短语和句柄
写在最前 本文为编译原理重点考察大题之一,理论基础见专栏文章,0基础直接使用也可食用 文章目录 推导构造语法树1.语法树的概念2. 子树,短语,简单短语,句柄2.1 子树2.2 短语2.3 简单短语与句柄2.4 真题实战 推导构造语…...
redis服务介绍
redis 基础概念安装使用基础操作命令数据类型操作命令 管理和维护命令 基础概念 Remote Dictionary Server(Redis)远程字典服务器是完全开源免费的,用C语言编写的,遵守BSD开源协议,是一个高性能的(key/val…...
nodepad 中换行符、tab替换
1 nodepad 主要符号 换行符: \r\n(windows) tab: \t 2 展示符号 3 相互替换 tip:需要点击扩展 参考: https://blog.csdn.net/lijing742180/article/details/85174564...
常见的字符串函数(包含头文件string.h)和字符函数(2)
八. strstr函数 1.strstr的定义 char *strstr( const char *str1, const char *str2 ); ->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置,记录并返回该位置的指针,如果找不到,则返回NULL ->2. str1:查找字符…...
Python | Leetcode Python题解之第187题重复的DNA序列
题目: 题解: L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…...
SpringCloud分布式微服务链路追踪方案:Skywalking
一、引言 随着微服务架构的广泛应用,系统的复杂性也随之增加。在这种复杂的系统中,应用通常由多个相互独立的服务组成,每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性,但也带来了新的挑战…...
首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会
6月22日,2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕,泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司(NASDAQ:LIDR)及光电器件规模化量产巨头Accelight Technologiesÿ…...
一文入门CMake
我们前几篇文章已经入门了gcc和Makefile,现在可以来玩玩CMake了。 CMake和Makefile是差不多的,基本上是可以相互替换使用的。CMAke可以生成Makefile,所以本质上我们还是用的Makefile,只不过用了CMake就不用再写Makefile了&#x…...
【LeetCode面试经典150题】117. 填充每个节点的下一个右侧节点指针 II
一、题目 117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个…...
RTDETR更换优化器——Lion
RTDETR更换Lion优化器 论文:https://arxiv.org/abs/2302.06675 代码:https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介: Lion优化器是一种基于梯度的优化算法,旨在提高梯度下降法在深度学习中的优化效果…...
Spring Boot中最佳实践:数据源配置详解
Spring Boot中最佳实践:数据源配置详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Spring Boot中如何进行最佳实践的数据源…...
第1章 物联网模式简介---独特要求和体系结构原则
物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外,物联网实施的固有复杂性(一端的现场设备在计算上受到挑战,另一端的云容量几乎无限)迫使架构师做出艰难的架构决策和实施选择。可用实现技…...
数据挖掘概览
数据挖掘(Data Mining)就是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的信息和知识的过程. 预测性数据挖掘 分类 定义:分类就是把一些新的数据项映射到给定类别中的某一个类别 分类流程&#x…...
【学习】软件测试中常见的文档类型及其作用
在软件开发的生命周期中,软件测试是确保产品质量的关键步骤。为了系统地进行测试活动,并保证测试结果的有效性和可追溯性,产生了一系列标准化的测试文档。这些文档不仅为测试人员提供了执行指南,而且为项目管理者和利益相关者提供…...
electron的托盘Tray
1.在主进程文件background.js中引入需要的文件 import { Tray, Menu } from "electron"; const path require("path");2.获取托盘图标 const baseSRC process.cwd(); //这里不能使用__dirname,使用dirname会直接获取dist_electron中的文件,…...
Harmony OS UI框架探索笔记
本文探讨了如何将现有的常用架构理论与Arkts和ArkUI结合起来,使代码更有条理,并利用Previewer快速调整布局,同时在不改变代码的情况下运行显示真实数据。 开发环境 Windows 11DevEco Studio 4.0 ReleaseBuild Version: 4.0.0.600, built on…...
transformers evaluate
☆ Evaluate https://huggingface.co/docs/evaluate/main/en/installation ★ 解决方案 常用代码 # 查看支持的评估函数 evaluate.list_evaluation_modules(include_communityTrue)# 加载评估函数 accuracy evaluate.load("accuracy")# load function descripti…...
【ONLYOFFICE深度探索】:ONLYOFFICE桌面编辑器8.1震撼发布,打造高效办公新境界
文章目录 一、功能完善的PDF编辑器:解锁文档处理新维度二、幻灯片版式设计:释放创意,打造专业演示三、改进从右至左显示:尊重多元文化,优化阅读体验四、新增本地化选项:连接全球用户,跨越语言障…...
C++系统相关操作4 - 获取CPU(指令集)架构类型
1. 关键词2. sysutil.h3. sysutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词: C 系统调用 CPU架构 指令集 跨平台 实现原理: Unix-like 系统: 可以通过 uname -m 命令获取 CPU 架构类型。Windows 系统: 可以通过环境变量 PROCESSOR_A…...
whisper 实现语音转文字
准备需要转码的音频 https://support.huaweicloud.com/sdkreference-sis/sis_05_0039.html 编码转吗的代码 import whisperif __name__ "__main__":file_path "16k16bit.wav"model whisper.load_model("small")result model.transcribe(f…...
使用VLLM部署llama3量化版
1.首先去魔塔社区下载量化后的llama3模型 git clone https://www.modelscope.cn/huangjintao/Meta-Llama-3-8B-Instruct-AWQ.git 2.跑起来模型 1)python -m vllm.entrypoints.openai.api_server --model /home/cxh/Meta-Llama-3-8B-Instruct-AWQ --dtype auto --…...
计算机缺失OpenCL.dll怎么办,OpenCL.dll丢失的多种解决方法
在使用电脑的过程中,我们经常会遇到一些开机弹窗问题。其中,开机弹窗找不到OpenCL.dll是一种常见的情况。本文将详细介绍开机弹窗找不到OpenCL.dll的原因分析、解决方法以及预防措辞,帮助大家更好地解决这一问题。 一,了解OpenCL.…...
git 本地代码管理
简介 git 能实现本地代码多个更改版本的管理和导出。 首先复制好项目(参考 git clone 别人项目后正确的修改和同步操作 中的前三步) 实操 克隆原始项目 首先,从远程仓库克隆项目到本地: git clone https://github.com/libo-huan…...
Docker(九)-Docker运行redis6.0.8容器实例
1.宿主机新建目录存放redis.conf文件 目的:运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…...
似然 与 概率
概率似然概率函数与似然函数的关系似然与机器学习的关系最大似然估计 似然与概率分别是针对不同内容的估计和近似 概率 概率:概率表达给定参数 θ \theta θ下样本随机向量 X x \textbf{X} {x} Xx的可能性。 概率密度函数的定义形式是 f ( x ∣ θ ) f(x|\t…...
Tableau数据可视化与仪表盘搭建
Tableau的主要目的 数据赋能和数据探索。 数据赋能: 1.分析师可以将数据看板发布到线上给其他部门使用 2.自动更新看板 3.自由下载数据 4.线上修改图表 5.邮件发送数据 6.设置数据预警 数据探索: 1.支持亿级数据的连接和处理 2.自由地对字段进行各种…...
web前端——HTML
目录 一、HTML概述 1.HTML是什么? 2.HTML具体化解释 二、HTML基本语法 1.声明 2. Head头标签 3.body身体标签 4.一个html的基本结构 5.标签 6.标签属性 ①属性的格式 ②属性的位置 ③添加多个属性 三、基本常用标签 1.超链接 2.图像标签 ①图像标…...
C++的模板(九):模板的实例化问题
前文子系统中的例子, SubSystem内部用了STL库的map模板: template <class Event, class Response> class SubSystem{ public:map<Event*, Response*> table; public:void bind(Event *e, Response *r);void unbind(Event *e); public:int OnMessage(E…...
Clickhouse Projection
背景 Clickhouse一个视图本质还是表,只支持一种order By,不然要维护太多的视图。 物化视图能力有限。 在设计聚合功能时,考虑使用AggregatingMergeTree表引擎,现在有了projections,打算尝试使用一下 操作 ADD PROJE…...
放烟花短视频素材去哪里找?去哪里下载?烟花素材网分享
在当代社会,短视频凭借其独有的魅力成为大众传递情感、记录生活、分享快乐的新兴方式。特别是在庆祝节日和特殊时刻时,烟花的绚丽效果常常被用来吸引观众的目光,成为视频作品中的亮点。然而,对于短视频制作者来说,寻找…...
爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例
下载MongoDB数据库 首先,需要下载MongoDB数据库,下载的话比较简单,直接去官网找到想要的版本下载即可,具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…...
Jenkins教程-10-发送飞书测试报告通知
上一小节我们学习了发送企业微信测试报告通知的方法,本小节我们讲解一下发送飞书测试报告通知的方法。 1、自动化用例执行完后,使用pytest_terminal_summary钩子函数收集测试结果,存入本地status.txt文件中,供Jenkins调用 conft…...
Swift开发——简单App设计
App的界面设计需要具有大量的图像并花费大量的时间,这样的应用不方便学习和交流,这里重点介绍SwiftUI界面元素的用法,通过简单App设计过程的讲解,展示图形用户界面应用程序的设计方法。 01、简单App设计 按照9.1节工程MyCh0901的创建方法,创建一个新的工程MyCh0902,此时工…...
Python操作mysql
一、python连接mysql 1.python连接mysql代码示例 from pymysql import Connection# 获取到mysql数据艰苦的连接对象 conn Connection(hostlocalhost,port3306,userroot,passwordroot ) # 打印mysql数据库软件信息 print(conn.get_server_info()) # 关闭到数据库的连接 conn.…...
监控易产品升级动态:V7.6.6.15版本全面升级
随着信息技术的不断发展,企业对系统监控和数据管理的需求日益增加。为了满足广大用户的实际需求,监控易团队经过不懈努力,成功推出了V7.6.6.15版本,对产品进行了全面升级和优化。本次升级不仅增强了产品的稳定性和可靠性ÿ…...
Vue3 + Element-plus + TS —— 动态表格自由编辑
前期回顾 《 穿越时空的代码、在回首:Evil.js两年后的全新解读 》-CSDN博客 Vue3 TS Element-Plus 封装Tree组件 《亲测可用》_ https://blog.csdn.net/m0_57904695/article/details/131664157?spm1001.2014.3001.5501 态表格 自由编辑 目录 ♻️ 效果图…...