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

【python高级】342-TCP服务器开发流程

CS模式:客户端-服务端模式

TCP客户端开发流程介绍(五步)(C端)
1.创建客户端套接字对象
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字
TCP服务端开发流程(七步)(S端)
1.创建服务端端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字

TCP客户端程序开发

import socket# 第一步:创建客户端套接字对象
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.AF_INET表示IPV4,socket.SOCK_STREAM表示TCP协议# 第二步:创建连接
tcp_client_socket.connect(("127.0.0.1", 8000))  # 参数是个元组# 第三步:发送数据到服务器端
tcp_client_socket.send("hello".encode("utf-8"))  # 这里将字符串编码成二进制数据# 第四步:接收服务器端返回的数据
recv_data = tcp_client_socket.recv(1024).decode("utf-8")  # 1024表示本次接收的最大字节数,decode解码
print(f"接收到的数据为:{recv_data}")  # 将二进制数据解码成字符串# 第五步:关闭套接字对象
tcp_client_socket.close()

tip:发送和接受的都要是二进制数据,所以要用encode和decode方法将字符串转换成二进制数据

  • encode():将字符串转换成二进制数据
  • decode():将二进制数据转换成字符串

关于socket.AF_INET、socket.SOCK_STREAM常量的介绍:

  • socket.AF_INET(IPv4)
    • 这是 Python 中socket模块里的一个常量,AF_INET代表 Address Family(地址族)为INET,用于指定网络通信使用的地址族是 IPv4 地址族。
    • 当创建一个套接字(socket)时,通过指定AF_INET,告诉操作系统这个套接字将用于基于 IPv4 协议的网络通信。
  • socket.SOCK_STREAM(TCP)
    • 这是socket模块中的另一个常量,用于指定套接字的类型为流套接字。
      • 当和AF_INET一起使用创建套接字时(如前面代码示例中的socket.socket(socket.AF_INET, socket.SOCK_STREAM)),它表示创建的是一个基于 TCP(Transmission Control Protocol)协议的流套接字。TCP 是一种面向连接的、可靠的传输协议,SOCK_STREAM类型的套接字利用 TCP 协议提供的特性,如三次握手建立连接、数据的可靠传输(通过确认、重传等机制)、流量控制和拥塞控制等。
      • 这种类型的套接字适用于需要保证数据准确无误地传输的应用场景,比如 HTTP(超文本传输协议)用于网页浏览,SMTP(简单邮件传输协议)用于发送电子邮件等。它提供了一个字节流的接口,应用程序可以像读写文件一样通过这个套接字进行数据的发送和接收,而不必担心数据的丢失或损坏,因为 TCP 协议在底层会处理这些问题。

TCP服务端程序开发(重点)

开发的七步:
1.创建服务端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求:类似于input() → accept()阻塞
5.接收数据
6.发送数据
7.关闭套接字

服务器如何判断是哪个客户端连接:
通过accept()方法返回的套接字对象来区分不同的客户端

import socket# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.AF_INET表示IPV4,socket.SOCK_STREAM表示TCP协议# 2.绑定端口号
tcp_server_socket.bind(("127.0.0.1", 8000))  # 如果是本机,可以不写ip地址# 3.设置监听
tcp_server_socket.listen(128)  # 128表示最大连接数# 4.等待接受客户端的连接请求
new_socket, ip_port = tcp_server_socket.accept()  # 阻塞状态,等待客户端连接
# tcp_server_socket对象主要用于接收客户端连接:绑定端口、设置监听、接收连接
# new_socket对象主要用于接收和发送数据
print(f"新连接的客户端地址为:{ip_port}")
print(f"新连接的客户端socket对象为:{new_socket}")# ================================================
# 5.接收数据
recv_data = new_socket.recv(1024).decode("utf-8")  # 1024表示本次接收的最大字节数,decode解码	
print(f"接收到的数据为:{recv_data}")# 6.发送数据
new_socket.send("信息已收到".encode("utf-8"))  # 将字符串编码成二进制数据# 7.关闭新套接字对象(关闭后不能收发消息)和服务端套接字对象(不能接收新连接)
new_socket.close()
tcp_server_socket.close()

当客户端发送信息后,接收到的data是一个元组,下面是个栗子,元组有两个元素,第一个元素是套接字对象,第二个元素是客户端的地址(也是元组)

(<socket.socket fd=432, family=AddressFamily.AF_INET, ttype=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 60925)>, ('127.0.0.1', 60925)
)

注意事项:

  • 明确自己开发的到底是客户端还是服务端
    • 客户端:connect()、send()、recv()、close()
    • 服务端:socket()、bind()、listen()、accept()、recv()、send()、close()
  • 两个对象要分清楚
    • tcp_server_socket:主要用于接收客户端连接
      • 内部只有服务器本身的信息,可以绑定端口、设置监听、接收连接
    • new_socket:主要用于接收和发送数据
      • 内部既有客户端又有服务器端信息,可以接收和发送数据
      • 只能通过这个新套接字来收发数据

服务器端面向对象版本

都是七步,不变

面向对象,先分析有哪些对象,创建类,属性和方法


# 第一步:创建类
class WebServer:# 第四步:创建初始化方法,初始化套接字对象def __init__(self):# 1.创建套接字对象self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # AF_INET表示IPV4,SOCK_STREAM表示TCP协议# 2.绑定ip和端口号self.tcp_server_socket.bind(("127.0.0.1", 8000))  # 如果是本机,可以不写ip地址# 这里的8000端口不会随着服务器关闭而释放,需要设置端口复用,端口复用在下一篇笔记# 3.设置监听self.tcp_server_socket.listen(128)  # 128表示最大连接数# 第五步:定义一个start方法,启动服务器,接收客户端连接def start(self):while True:# 4.等待接受客户端的连接请求new_socket, ip_port = self.tcp_server_socket.accept()# 5.接收数据recv_data = new_socket.recv(1024).decode("utf-8")print(f"接收到的数据为:{recv_data}")# 6.发送数据new_socket.send("信息已收到".encode("utf-8"))# 7.关闭套接字(只能接收一次信息)# 不能关闭tcp_server_socket,否则无法继续接收新连接new_socket.close()# 目前一次只能接收一个客户端,因为是单进程# 如果希望服务器可以同时和多个客户端收发消息,需要多进程(多任务编程)# 第二步:实例化对象
ws = WebServer()# 第三步:调用start方法,启动服务器,接收客户端连接
ws.start()

端口复用

在上一次关闭服务器后,端口不会立即释放,需要设置端口复用,才能继续使用此端口

import socketclass WebServer:# 3、定义一个__init__方法,初始化套接字对象def __init__(self):self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用(在上一次关闭服务器后,端口不会立即释放,需要设置端口复用)self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)  # 参数2:SOL_SOCKET表示当前套接字对象,参数3:SO_REUSEADDR表示复用的地址,参数4:True表示开启端口复用(默认是false,要等待很长时间端口才会自动释放)self.tcp_server_socket.bind(("127.0.0.1", 8000))  # 如果是本机,可以不写ip地址self.tcp_server_socket.listen(128)  # 128表示最大连接数# 4、定义一个start方法,启动服务器,接收客户端连接def start(self):while True:# 等待接受客户端的连接请求new_socket, ip_port = self.tcp_server_socket.accept()# 调用自身的handle_request()方法,用于接收和发送消息(封装性)self.handle_request(new_socket, ip_port)# 5、定义一个handle_request方法,用于接收和发送消息def handle_request(self, new_socket, ip_port):# 接收某个客户端发送过来的消息recv_data = new_socket.recv(1024).decode("utf-8")  # 实际工作中一条数据大小在1~1.5k之间print(f"接收到的数据为:{recv_data}")# 发送消息给客户端new_socket.send("信息已收到".encode("utf-8"))# 关闭套接字new_socket.close()# 定义一个程序的执行入口
if __name__ == "__main__":# 1、实例化服务器对象server = WebServer()# 2、启动服务器server.start()

开发注意事项

1.当TCP客户端程序想要和TCP服务端程序进行通信的时候必须要先建立连接
2.TCP客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
3.TCP服务端程序必须绑定端口号,否则客户端找不到这个TCP服务端程序。
4.listen后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
5.当TCP客户端程序和TCP服务端程序连接成功后,TCP服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
6.关闭accept返回的套接字意味着和这个客户端已经通信完毕。
7.当客户端的套接字调用close后,服务器端的recv会解阻塞,返回的数据长度为O,服务端可以通过返回数据的长度来判断客户端是否
已经下线,反之服务端关闭套接字,客户端的recv也会解阻塞,返回的数据长度也为0。

UDP客户端

# 导入socket模块
import socket# 创建UDP套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 连接服务器,发送数据
udp_socket.sendto("消息".encode("utf-8"), ("127.0.0.1", 8000))# 关闭套接字
udp_socket.close()

相关文章:

【python高级】342-TCP服务器开发流程

CS模式&#xff1a;客户端-服务端模式 TCP客户端开发流程介绍&#xff08;五步&#xff09;&#xff08;C端&#xff09; 1.创建客户端套接字对象 2.和服务端套接字建立连接 3.发送数据 4.接收数据 5.关闭客户端套接字 TCP服务端开发流程&#xff08;七步&#xff09;&#xf…...

C++开源项目 VLC 源代码的交叉编译以及库的裁剪方法详解

目录 1、VLC简介 2、VLC编译环境配置 2.1、编译环境 2.2、编译环境配置 2.2.1、下载安装MSYS2 2.2.2、下载mingw-w64 3、编译VLC 4、VLC库的裁剪 5、总结 C软件异常排查从入门到精通系列教程&#xff08;核心精品专栏&#xff0c;订阅量已达600多个&#xff0c;欢迎订…...

draw.io 导出svg图片插入word后模糊(不清晰 )的解决办法

通常我们将图片从draw.io导出为svg格式后插入word, 会发现字体不清晰&#xff0c;特别是使用宋体时&#xff0c;折腾了半天&#xff0c;得到如下办法&#xff1a; 方法1: 在draw.io中导出pdf文件&#xff0c;使用 PDF转SVG转换器 - SVGConverter 将其转换为svg, 完美呈现。 …...

详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用

目录 详解js柯里化原理及用法&#xff0c;探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用 一、什么是柯里化&#xff1f; 1、原理解析 2、一个直观的例子 二、如何实现柯里化&#xff1f; 1、底层实现 2、工作原理解析 3…...

Cesium材质——Material

简介&#xff1a; Cesium.Material对象的目的&#xff0c;就是生成一段名称为czm_getMaterial的函数&#xff08;示例代码如下&#xff09;&#xff0c; 这个czm_getMaterial函数&#xff0c;是shader代码&#xff0c;会被放到片元着色器中使用。 czm_material czm_getMater…...

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …...

统计某个文件中某个字符串出现的次数

要统计某个文件中某个字符串出现的次数&#xff0c;有多种方法可以实现。以下是几种常用且高效的 Linux 命令方法&#xff1a; 方法一&#xff1a;使用 grep 和 wc 命令示例&#xff1a; grep -o "字符串" 文件名 | wc -l说明&#xff1a; grep -o "字符串&…...

C++简明教程(文章要求学过一点C语言)(3)

一、编程工具大揭秘——IDE 当我们准备踏入 C 编程的奇妙世界时&#xff0c;首先要认识一个重要的“魔法盒子”——集成开发环境&#xff08;IDE&#xff09;。IDE 就像是一个全能的编程工作室&#xff0c;它把我们写代码所需要的各种工具都整合到了一起&#xff0c;让编程这件…...

Springboot高并发乐观锁

Spring Boot分布式锁的主要缺点包括但不限于以下几点&#xff1a; 性能开销&#xff1a;使用分布式锁通常涉及到网络通信&#xff0c;这会引入额外的延迟和性能开销。例如&#xff0c;当使用Redis或Zookeeper实现分布式锁时&#xff0c;每次获取或释放锁都需要与这些服务进行交…...

编译原理复习---正则表达式+有穷自动机

适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或regexp&#xff09;是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成&#xff0c;这些字符和符号定义了一种搜索模式…...

如何使用ChatGPT辅助文献综述,以及如何进行优化?一篇说清楚

目录 1.写在开头 2.ChatGPT 3.提示词研究 4.第一轮研究 5.第二轮研究 6.生成文献综述 嘿宝子们&#xff01;今天我们要聊的&#xff0c;可是个让学术圈都为之振奋的话题——ChatGPT辅助文献综述。这个教育界的新宠儿&#xff0c;已经不满足于仅仅在学习和教学中露两手了&…...

ZZNUOJ 1601:字母序号(C/C++/Java)

题目描述 我们把字母 A-Z 分别编号为 1-26, 现在给你一个大写字母, 输出这个大写字母的序号。 输入 输入一个大写字母 输出 输出这个大写字母的序号 样例输入 C 样例输出 3 常见的ASCII值 ASCII表中可以记下部分特殊的值(十进制)(字母从A到Z,从a到z,ASCII值依次递增)...

[CISCN 2021初赛]rsa

[CISCN 2021初赛]rsa 源代码&#xff1a; from flag import text,flag import md5 from Crypto.Util.number import long_to_bytes,bytes_to_long,getPrimeassert md5.new(text).hexdigest() flag[6:-1]msg1 text[:xx] msg2 text[xx:yy] msg3 text[yy:]msg1 bytes_to_lo…...

Electron -- Electron Fiddle(一)

Electron Fiddle 是一个由 Electron 团队开发的开源工具&#xff0c;它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面&#xff0c;使用户无需配置复杂的开发环境&#xff0c;就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...

java 实现排序的几种方式

冒泡排序(Bubble Sort) 基本原理&#xff1a; 它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。 示例代码如下&#xff1a; 登…...

【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…...

陀螺仪选型

瑞芬官网 datasheet 陀螺仪、IMU姿态仪、陀螺转角仪、三轴姿态仪、三轴陀螺仪 mid360 imu ICM-40609-D TDK InvenSense | Mouser https://product.tdk.com/system/files/dam/doc/product/sensor/mortion-inertial/imu/data_sheet/ds-000330_icm-40609-d_v1.2.pdf...

【超详细实操内容】django的身份验证系统之限制用户访问的三种方式

目录 1、使用request.user.is_authenticated属性 2、装饰器login_required 3、LoginRequiredMixin类 通常情况下,网站都会对用户限制访问,例如,未登录的用户不可访问用户中心页面。Django框架中使用request.user.isauthenticated属性、装饰器loginrequired和LoginRequire…...

Pika Labs技术浅析(六):自动化技术

Pika Labs 的自动化技术旨在通过工作流引擎和自动化警报系统&#xff0c;帮助用户实现业务流程的自动化和实时监控。 一、自动化技术模块概述 Pika Labs 的自动化技术模块旨在通过以下两个核心组件&#xff0c;实现业务流程的自动化和实时监控&#xff1a; 1.工作流引擎&…...

springboot471基于协同过滤算法商品推荐系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装协同过滤算法商品推荐系统软件来发挥其高效地信息处理的作用…...

【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101错误

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802956.html?templateId1718516 问题现象 某客户的业务在通过YashanDB jdbc驱动查询含有st_geometry列的数据时&#xff0c;报如下异常&#xff1a;YAS-00101 cannot allocate 0 byte…...

ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。

在 Web 开发中&#xff0c;GET 和 POST 是两种常见的 HTTP 请求方法&#xff0c;它们有一些显著的区别。此外&#xff0c;datatype 参数在 jQuery 的 ajax() 请求中指定了预期的响应数据类型。接下来&#xff0c;我会详细解释这些问题。 1. GET 和 POST 请求的区别 GET 请求 和…...

EKF异常状态自检

https://wenku.csdn.net/column/25p1jkf4vz https://www.zhihu.com/question/293038308/answers/updated https://zhuanlan.zhihu.com/p/12011086094 常用数据分析方法&#xff1a;方差分析及实现&#xff01;-腾讯云开发者社区-腾讯云 方差分析的七种类型_双因素方差分析 自变…...

《解析 MXNet 的 C++版本在分布式训练中的机遇与挑战》

在深度学习的广袤领域中&#xff0c;分布式训练已成为应对大规模数据和复杂模型训练需求的关键手段。MXNet 作为一款备受瞩目的深度学习框架&#xff0c;其 C版本在分布式训练方面展现出独特的魅力&#xff0c;同时也面临着诸多挑战。深入探究这些优势与挑战&#xff0c;对于推…...

UVM学习总结

问题1&#xff1a;同时出现几个相同的uvm_config_de()哪个有效&#xff1f; UVM中的配置对象是通过uvm_config_db类实现的。uvm_config_db类使用一对名称和值来存储配置信息。当多个uvm_config_db.call()调用同时提供相同名称的配置时&#xff0c;最后一个调用将覆盖之前的调用…...

TCP/IP 介绍:网络通信的基石

TCP/IP 介绍&#xff1a;网络通信的基石 计算机通信协议概述 在数字时代&#xff0c;计算机之间的通信变得至关重要。计算机通信协议&#xff08;Computer Communication Protocol&#xff09;是一套规则&#xff0c;定义了计算机如何相互交流信息。这些协议确保了不同制造商…...

华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…...

基于Spring Boot的建材租赁系统

一、系统背景与目的 随着建筑行业的快速发展&#xff0c;建材租赁需求日益增加。传统的建材租赁管理方式大多依赖于纸质文档或简单的电子表格&#xff0c;不仅效率低下&#xff0c;还容易出现信息遗漏和错误。为了解决这些问题&#xff0c;基于Spring Boot的建材租赁系统应运而…...

YOLO v5 Series - MQTT

MQTT...

uni-app开发订单列表页面

目录 一:功能描述 二:功能实现 一:功能描述 订单列表页面包含三个部分,最上面显示订单的状态信息,可以根据订单进行切换,中间显示订单的商品和价格信息,最下面显示订单的操作按钮,可以根据不同的状态操作订单。 二:功能实现 1:状态切换 <view class="nav-…...

14,攻防世界Web_php_unserialize

进入场景 看见代码&#xff0c;解析一下 这段PHP代码定义了一个名为Demo的类&#xff0c;并演示了如何通过URL参数进行反序列化和文件高亮显示的功能&#xff0c;同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释&#xff1a; 1.<php 开始PHP代码…...

基于单片机的电梯声控系统设计(论文+源码)

1.系统设计 在目前的高楼住宅&#xff0c;商业大厦中电梯是不可或缺的&#xff0c;而传统的电梯控制器系统&#xff0c;通常需要用户用手去按下按键进行控制&#xff0c;但是这种方式在有些情况下&#xff0c;并不完善&#xff0c;比如在本次新冠疫情期间&#xff0c;由于新冠…...

宠物用品电子商务系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

每日一题 341. 扁平化嵌套列表迭代器

341. 扁平化嵌套列表迭代器 展开成数组来解题 class NestedIterator {vector<int> nums;int idx;void flattened(vector<NestedInteger> &nestedList){for(int i0;i<nestedList.size();i){if(nestedList[i].isInteger()){nums.push_back(nestedList[i].get…...

小程序 - 模拟时钟

微信小程序常用API练习 - 模拟时钟小程序开发笔记 模拟时钟 “模拟时钟”微信小程序是一个简约风格的动态时钟&#xff0c;该时钟时间与系统时间一致&#xff0c;且时针、分针、秒针会与系统时间同步更新&#xff0c;用户可以很方便地查看时间。下面将对“模拟时钟”微信小程序…...

UDP的报文结构和特点

1.UDP传输协议的特点 使用UDP传输协议进行通信&#xff0c;过程类似于寄信&#xff0c;它的特点如下&#xff1a; 无连接&#xff1a;知道对端的IP号和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b;不可靠&#xff1a;没有可靠机制&#xff0c;发送数据包以后&a…...

如何在服务器上克隆、pull、push GitHub私有项目

诸神缄默不语-个人CSDN博文目录 情况是这样的&#xff0c;我直接用git clone命令后&#xff0c;会提示让我输入GitHub账号密码&#xff0c;我输入后它还是显示克隆失败&#xff0c;并显示&#xff1a; Cloning into folder_name... Username for https://github.com: user_na…...

mybatis 动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架&#xff0c;你应该能理解根据不同条件拼接 SQL 语句有多痛苦&#xff0c;例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL&#xff0c;可以彻底…...

LeetCode 1661. 每台机器的进程平均运行时间

LeetCode 1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂…...

【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结

文章目录 生产者端&#xff08;消息发布端&#xff09;保证机制RabbitMQ服务器端保证机制消费者端&#xff08;消息接收端&#xff09;保证机制除了MQ自带的机制&#xff0c;还能做的操作持久化的原理ACK思想 更多相关内容可查看 消息从发送&#xff0c;到消费者接收&#xff0…...

在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、翻译环境和运行环境二、翻译环境1.编译预处理编译汇编 2.链接 三、运行环境 一、翻译环境和运行环境 在 ANSI C 的任何⼀种实现中&am…...

Codeforces Round 994 (Div. 2)-D题

题目链接:https://codeforces.com/contest/2049/problem/D 题目大意是在开始移动之前,可以任意次将一行元素向左挪一格,代价是1,开始游戏后,只能向下走或者向右走,直到走到终点,问最小代价是多少. constexpr ll inf 1E18; void solve() {int n, m, K;std::cin >> n &g…...

【计算机视觉】opencv-停车位检测原理及代码演示

概述 本文介绍了一种基于OpenCV库的停车场空位检测方法。通过本项目演示&#xff0c;可以对opencv库有更深刻的理解。文章详细阐述了检测原理、算法流程以及代码实现。 一、原理介绍 基于OpenCV的停车位检测原理涉及多个图像处理步骤&#xff0c;以下将结合相关公式详细介绍每…...

C++面向对象三大特征之一 ——(多态)

C面向对象三大特征之一 ——多态 一. 多态的概念二. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的两个例外&#xff1a; 2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 三. 抽象类接口继承和实现继承 四.多态的原理4.1虚函数…...

HTTP协议及安全防范

由于图片解析问题&#xff0c;可以点击查看 &#x1f449;&#x1f3fb; 博客原文 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议&#xff0c;客户端通过发送请求到服务器来获取…...

JVM简介—1.Java内存区域

1.运行时数据区的介绍 (1)运行时数据区的定义 Java虚拟机在执行Java程序的过程中&#xff0c;会把它所管理的内存划分为若干个不同的数据区域&#xff0c;这些区域各有各的用途以及各自的创建和销毁时间也不一样。有的区域会随着虚拟机的进程启动而存在&#xff0c;有的区域则依…...

IPC协议获取签名信息

一&#xff1a;IPC协议获取签名信息详解 目录 什么是IPC协议&#xff1f;签名信息概述IPC协议中签名信息获取的流程相关知识点 数字签名原理常见签名算法数据完整性与认证签名的生成与验证IPC中的安全传输 应用场景总结 什么是IPC协议&#xff1f; IPC&#xff08;Inter-Pro…...

高校就业管理系统:数据驱动的就业服务创新

1 Java语言 Java语言是目前最流行的语言之一&#xff0c;不仅可以做桌面窗口形式的程序&#xff0c;还可以做浏览器访问的程序&#xff0c;目前最流行的就是用Java语言作为基础&#xff0c;做各种程序的后台处理。Java语言是操作变量的语言&#xff0c;而变量则是Java对于数据存…...

C++中的模板元编程

模板元编程 模板特化&#xff1a; 指的是对某个特定类型或特定类型组合提供模板的定制实现。 示例&#xff1a; #include<iostream> using namespace std;template <typename T> void func(T t) {cout << "Generic template: " << t <…...

rk3568制冷项目驱动开发流程汇总(只适用于部分模块CIF DVP等,自用)

采用fpga输入&#xff0c;3568采集并显示至hdmi RKVICAP 驱动框架说明 RKVICAP驱动主要是基于 v4l2 / media 框架实现硬件的配置、中断处理、控制 buffer 轮转&#xff0c;以及控制 subdevice(如 mipi dphy 及 sensor) 的上下电等功能。 对于RK356X 芯片而言&#xff0c; VICAP…...