Python-简单网络编程 I
目录
- 一、UDP 网络程序
- 1. 通信结构图
- 2. Python 代码实现
- 1)服务器端
- 2)客户端
- 3. 注意
- 二、TCP 网络程序
- 1. 通信结构图
- 2. Python 代码实现
- 1)服务器端
- 2)客户端
- 3. 注意
- 三、文件下载
- 1. PyCharm 程序传参
- 1)图形化界面传参
- 2)命令行运行传参
- 2. Python 代码实现
- 1)服务器端
- 2)客户端
- 四、使用 epoll 实现即时聊天
- 1. 原理与步骤
- 2. Python 代码实现 (Linux 下运行)
- 1)服务器端
- 2)客户端
- 3. PyCharm 连接远程服务器步骤
- 1)启用相关插件
- 2)添加 SSH 解释器
一、UDP 网络程序
1. 通信结构图
创建一个基于 UDP 的网络程序流程很简单,具体步骤如下:
-
创建一个套接字(
socket.socket()
) -
服务器绑定 ip 和 port(
bind()
) -
发送 / 接收数据(
sendto()
和recvfrom()
) -
关闭套接字(
close()
)
2. Python 代码实现
1)服务器端
import socket# 先运行
# 创建udp socket对象,AF_INET代表IPv4,SOCK_DGRAM代表UDP
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址(本机ip+指定端口号),用 ipconfig 命令查看本机ip地址
address = ('10.204.6.120', 8080) # 写1024以上的端口
try:# 绑定地址,利用 netstat -an|grep 8080 命令查看端口是否被占用# 绑定后才能发送接收,绑定失败直接抛异常server.bind(address)# 接收数据,参数为缓冲区大小data, addr = server.recvfrom(1024)print(f"Received message: '{data.decode("utf-8")}' from {addr}")# 发送数据server.sendto('nice to meet you'.encode("utf-8"), addr)
except OSError:print("Binding failed, the port is occupied or the IP address is invalid.")
finally:# 关闭udp socket对象server.close()
2)客户端
import socket# 后运行
# 创建客户端udp socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 目标服务器的IP和端口
dest_addr = ('10.204.6.120', 8080)
# 不绑定端口,系统会自动分配一个临时端口
try:# 发送数据client.sendto(b'nice to meet you too', dest_addr)# 打印自动分配的端口号print("Local socket address:", client.getsockname()[1])# 接收数据,设置超时防止阻塞过久client.settimeout(5)data, addr = client.recvfrom(1024)print(f"Received message: '{data.decode("utf-8")}' from {addr}")
except socket.timeout:print("No response received within timeout.")
finally:client.close()
3. 注意
-
如果出现
OSError: [Errno 98] Address already in use
的情况,说明端口已被其他进程占用,因此 bind 失败,换一个端口号即可。 -
使用
lsof
命令查看端口。 -
UDP 中 recvform 内部要接收的大小必须大于发送的字节数。否则:
- 对于英文字符:在 Windows 下会直接报错;在 Linux 下不会报错,没有接收到的数据直接丢弃。
- 对于中文字符:不管在 Windows 下还是 Linux 下都直接报错。
-
对于 UDP :sendto 和 recvfrom 的次数要完全对等。
UDP 发送接收数据的特点:
每 sendto 一次,就往内核里放了一个队列结点;每 recvfrom 一次,就拿走一个队列结点,同时内核删除该结点。因此,recvfrom 的大小要大于 sendto 发送的报文大小,否则在获取时 Linux 会直接丢弃(在 Windows 下会报异常)。
- UDP 网络程序的服务器端需要绑定 IP 地址和端口号,而客户端可以不绑定端口号。
- 如果不显式调用绑定(bind)端口号的操作,操作系统会自动帮程序分配一个随机的 “临时端口号” ,因此,如果重新运行程序,端口可能会发生变化。
- 如果显式调用绑定操作,指定某个固定的 IP 地址和端口号,操作系统就会把收到的发往这个端口号的 UDP 数据包交给该程序处理。
总结:不绑定端口,系统分配随机端口,端口会变;绑定端口,端口固定,程序用该端口接收数据。
换句话说,端口号是程序接收数据的 “身份标识” ,只要绑定成功,这个端口号就是程序的固定入口,其他程序或设备给该端口发的 UDP 数据都会被该程序接收。
二、TCP 网络程序
1. 通信结构图
在程序中,如果想要完成一个 TCP 服务器的功能,需要的流程如下:
-
创建一个套接字(
socket.socket()
) -
服务器绑定 ip 和 port(
bind()
) -
将服务器的套接字从主动连接变为被动连接(
listen()
) -
服务器等待客户端的连接(
accept()
) -
客户端连接服务器(
connect()
) -
接收 / 发送数据(
send()
和recv()
) -
关闭套接字(
close()
)
2. Python 代码实现
1)服务器端
import socket def tcp_server(): # 创建tcp socket对象,SOCK_STREAM代表TCPserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器地址(本机ip+端口号) address = ('10.204.6.120', 8080) # 写1024以上的端口 # 绑定地址,此时端口没有激活 server.bind(address) # 服务器端开始监听,此时端口激活# 参数是socket可以排队的最大连接个数server.listen(128) # 等待客户端连接,跟客户端进行后续通信的是new_clientnew_client, client_addr = server.accept() # 发送数据 new_client.send('你好'.encode('utf-8')) # 接收数据data = new_client.recv(1024) print(f'接收到的数据:{data.decode("utf-8")}') # 关闭tcp socket对象 new_client.close() server.close() if __name__ == '__main__':
tcp_server()
2)客户端
import socket def tcp_client(): # 创建客户端tcp socket对象 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器地址 dest_addr = ('10.204.6.120', 8080) # 连接服务器 client.connect(dest_addr) # 接收数据 data = client.recv(1024) print(f'接收到的数据:{data.decode("utf-8")}')# 发送数据 client.send('Hello'.encode('utf-8')) # 关闭tcp socket对象 client.close() if __name__ == '__main__': tcp_client()
3. 注意
-
TCP 网络程序的服务器端需要绑定 IP 地址和端口号,否则客户端找不到该服务器。
-
TCP 网络程序的客户端不需要进行绑定操作,因为需要客户端主动连接服务器,所以只要确定好服务器的 IP 地址和 Port 等信息,而本地客户端的信息可以随机。
-
TCP 服务器调用 listen() 操作将主动套接字变为被动套接字,导致套接字从 CLOSED 状态转换为 LISTEN 状态,等待接受来自其他主动套接字的连接请求。
-
当客户端需要连接服务器时,就需要调用 connect() 操作,UDP 是直接发送的,可以不需要连接;但是 TCP 只有连接成功后才能通信。当一个 TCP 客户端连接服务器时,服务器端会产生一个新的套接字,该套接字用来标记这个客户端,单独为这个客户端服务。
listen() 操作将主动套接字变为被动套接字,用于接收客户端的连接请求;
accept() 操作返回的新套接字用于标记新客户端。
-
关闭 listen() 后的套接字又从被动套接字变回主动套接字,会导致新的客户端不能连接服务器,但之前已经成功连接的客户端仍可正常通信。
-
关闭 accept() 返回的套接字意味着这个客户端已经服务完毕。
-
当客户端的套接字调用 close() 操作关闭连接后,服务器端的 recv() 解堵塞,并且返回的长度为 0,因此服务器可以通过返回数据的长度来判断客户端是否已经下线。
如果服务器之前执行 recv() 时因为套接字没有数据而阻塞(等待数据),那么当客户端关闭连接后,服务器端的 recv() 不再阻塞,会立即返回。recv() 函数返回值代表接收到的数据长度,如果返回 0,表示 “连接被关闭” ,即对端已经关闭了连接。服务器通过检查 recv() 的返回值,判断是否为 0,如果是 0,就能确定客户端已经正常关闭了连接(客户端下线)。
三、文件下载
基本协议设计:
-
客户端(Client)send 文件名 → recv 文件内容 → 内容写入文件
-
服务器(Server)recv 文件名 → 读文件内容 → send 文件内容
1. PyCharm 程序传参
sys.argv
是参数列表(需要 import sys
),len(sys.argv)
计算参数列表的长度。
1)图形化界面传参
- 选择需要传参的程序,点击 “编辑配置…” 。
- 在如下图所示的位置填写需要填写的参数。例如我填写了本机的 IP 地址和一个随机的端口号,最后点击 “确定” 即可。
- 运行下面程序可知参数传入成功。
2)命令行运行传参
打开 PyCharm 终端,运行 python [运行的程序] [传递的参数]
命令,如下图所示。
PyCharm 启动时用的是绝对路径,而在命令行执行的是相对路径。
2. Python 代码实现
1)服务器端
from socket import *
import sysdef get_file_content(file_name): # 获取文件的内容try:with open(file_name, "rb") as f:content = f.read()f.close()return contentexcept:print(f'没有名为《{file_name}》的文件')return Nonedef file_tcp_server():if len(sys.argv) != 3:print("请先在终端进行传参操作:python server.py IP地址 端口号")returnelse:ip = sys.argv[1] # '10.204.6.120' (str)port = int(sys.argv[2]) # 7890 (int)# 创建 sockettcp_server_socket = socket(AF_INET, SOCK_STREAM)# 本地信息address = (ip, port)# 绑定本地信息tcp_server_socket.bind(address)# 128 表示等待连接的最大数量tcp_server_socket.listen(128)# 等待客户端的连接,即为这个客户端发送文件client_socket, client_addr = tcp_server_socket.accept()# 接收对方发送过来的数据recv_data = client_socket.recv(1024) # 接收 1024 个字节file_name = recv_data.decode("utf-8")print("对方请求下载的文件名为: %s" % file_name)# 获取文件的内容file_content = get_file_content(file_name)# 发送文件的数据给客户端# 因为获取打开文件时是以 rb 方式打开,所以 file_content 中的数据已经是二进制的格式,因此不需要 encode 编码if file_content is not None:client_socket.send(file_content)# 关闭这个套接字client_socket.close()# 关闭监听套接字tcp_server_socket.close()if __name__ == "__main__":file_tcp_server()
2)客户端
from socket import *def file_tcp_client():# 创建 sockettcp_client_socket = socket(AF_INET, SOCK_STREAM)# 目的信息# server_ip = input("请输入服务器 ip:")server_ip = '10.204.6.120'# server_port = int(input("请输入服务器 port:"))server_port = 7890# 连接服务器tcp_client_socket.connect((server_ip, server_port))# 输入需要下载的文件名file_name = input("请输入要下载的文件名:")# 发送文件下载请求tcp_client_socket.send(file_name.encode("utf-8"))# 接收对方发送过来的数据,最大接收 1024 个字节(1K)recv_data = tcp_client_socket.recv(1024)if recv_data:print('接收到的数据为:', recv_data.decode('utf-8'))else:print('没有接收到数据')# 关闭套接字tcp_client_socket.close()if __name__ == "__main__":file_tcp_client()
注:
- 运行时先运行服务器端(server),再运行客户端(client)。
- 服务器的 IP 请根据实际情况自行修改(cmd 中使用 ipconfig 命令查看),端口号也可以自行填写(2000 以上的均可)。
- 传参在配置中修改。
四、使用 epoll 实现即时聊天
epoll
是对 select 和 poll 模型的改进,提高了网络编程的性能,广泛应用于大规模并发请求的 C/S 架构中。它的触发方式是边缘触发 / 水平触发,只适用于 Unix / Linux 操作系统,如果想在 PyCharm 上运行,需要连接远程服务器。
1. 原理与步骤
-
创建一个 epoll 对象:
导入 select 模块:import select
创建一个 epoll 对象:epoll = select.epoll()
-
让 epoll 对象在指定的 socket 上监听指定的事件:
注册要监控的文件描述符和事件:epoll.register(文件描述符, 事件类型)
(I) 返回 epoll 的控制文件描述符:epoll.fileno()
(II) 事件类型:
可读事件 select.EPOLLIN ;
可写事件 select.EPOLLOUT ;
错误事件 select.EPOLLERR ;
客户端断开事件 select.EPOLLHUP 。
- 轮询 epoll 对象,哪些 socket 发生了哪些指定的事件:
epoll.poll(timeout)
:当文件句柄发生变化时,会以列表的形式主动报告给用户进程
timeout 为超时时间,默认为 -1 ,即一直等待直到文件句柄发生变化;如果指定为 1 ,那么 epoll 每 1 秒汇报一次当前文件句柄的变化情况,如果无变化则返回空。
-
在这些 socket 上执行一些操作。
-
让 epoll 对象修改并监控 socket 列表和 / 或事件。
-
重复以上步骤 ,直至完成。
-
销毁 epoll 对象:
关闭 epoll 对象的控制文件描述符:epoll.close()
销毁文件描述符:epoll.unregister(文件描述符)
2. Python 代码实现 (Linux 下运行)
1)服务器端
# !/usr/bin/python
# -*- coding:utf-8 -*-import socket
import select
import sysclass ChatServer:def __init__(self, ip, port):self.ip = ipself.port = port# 创建socketself.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定本地信息self.sock.bind((self.ip, self.port))# 开始监听self.sock.listen(10)# 创建一个epoll对象self.epoll = select.epoll()def chat(self):# 注册并监控self.sockself.epoll.register(self.sock.fileno(), select.EPOLLIN)# 注册并监控标准输入self.epoll.register(sys.stdin.fileno(), select.EPOLLIN)while True:events = self.epoll.poll(-1) # 轮询注册的事件for fd, event in events:if fd == self.sock.fileno(): # 如果是socket创建的套接字# 等待客户端连接client_socket, client_addr = self.sock.accept() # 接收连接print("New connected by:", client_addr)# 注册并监控新连接的可读事件self.epoll.register(client_socket.fileno(), select.EPOLLIN)elif fd == sys.stdin.fileno(): # 如果是标准输入# 服务器端先读标准输入msg = input()# 然后将标准输入发送给客户端client_socket.send(msg.encode("utf-8"))elif fd == client_socket.fileno(): # 如果是客户端发送过来的数据# 接收客户端发送过来的数据data = client_socket.recv(1024).decode("utf-8")if data:print("Received from client:", data)else:print("Client has been closed.")self.epoll.unregister(client_socket.fileno()) # 取消注册client_socket.close()breakif __name__ == "__main__":s = ChatServer("192.168.200.128", 8080)s.chat()
2)客户端
# !/usr/bin/python
# -*- coding:utf-8 -*-import socket
import select
import sysclass ChatClient:def __init__(self, ip, port):self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.sock.connect((ip, port))self.epoll = select.epoll()def chat_client(self):# 让epoll监控self.sock套接字的可读事件self.epoll.register(self.sock.fileno(), select.EPOLLIN)self.epoll.register(sys.stdin.fileno(), select.EPOLLIN)while True:events = self.epoll.poll(-1)for fd, event in events:if fd == self.sock.fileno():data = self.sock.recv(1024).decode("utf-8")if not data:print("Server has been closed.")self.epoll.unregister(self.sock.fileno())self.sock.close()breakelse:print("Received from server:", data)elif fd == sys.stdin.fileno():msg = input()self.sock.send(msg.encode("utf-8"))if __name__ == "__main__":c = ChatClient("192.168.200.128", 8080)c.chat_client()
3. PyCharm 连接远程服务器步骤
1)启用相关插件
首先,确保 PyCharm 是专业版的。
步骤:
-
打开 PyCharm ,进入 “文件 File” → “设置 Settings” → “插件 Plugins” 。
-
在 “已安装 Installed” 标签下,确保 “部署 Deployment” 中的 “FTP/SFTP/WebDAV Connectivity” 和 “其他工具 Other Tools” 中的 “Terminal” 已勾选。如果没有这两个插件,前往 “Marketplace” 中下载。
勾选 “FTP/SFTP/WebDAV Connectivity” 可以解决 “工具 Tools” 下没有 “部署 Deployment” 的问题。
- 如果未勾选,则勾选后需重启 PyCharm 。
2)添加 SSH 解释器
步骤:
-
打开 PyCharm ,进入 “文件 File” → “设置 Settings” → “项目 Project: [项目名称]” → “Python 解释器 Interpreter” 。
-
点击右上角的添加解释器 Add ,选择 “基于 SSH …” 并进行配置。
注:确保虚拟机已开启。
主机如何填写?
打开 VMware Workstation Pro 中的虚拟机,点击虚拟机右上角的倒三角 ▼ ,选择 “网络” ,按下图所示步骤查看 IPv4 地址,将该地址复制并填入主机处。
连接 SSH 服务器的详细步骤:
- 选择 “新建” ,并填写主机和用户名信息,点击三次 “下一步” 。
此时一定要确保虚拟机是开启状态,否则将无法成功连接 SSH 服务器。
- 选择 “系统解释器” ,可以自行选择是否修改远程路径,最后点击 “创建” 即可。
例如:我将远程路径改为/home/kusunoki/PyCharm_SSH
- 此时就可以通过右下角随时切换解释器和默认部署服务器了。
注意在切换 SSH 解释器时需要确保虚拟机开启。
相关文章:

Python-简单网络编程 I
目录 一、UDP 网络程序1. 通信结构图2. Python 代码实现1)服务器端2)客户端 3. 注意 二、TCP 网络程序1. 通信结构图2. Python 代码实现1)服务器端2)客户端 3. 注意 三、文件下载1. PyCharm 程序传参1)图形化界面传参2…...

鸿蒙北向应用开发: deveco5.0 创建开源鸿蒙项目
本地已经安装deveco5.0 使用5.0创建开源鸿蒙项目 文件->新建->新建项目 直接创建空项目,一路默认 next 直接编译项目 直接连接开源鸿蒙5.0开发板编译会提示 compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the dev…...
数据库故障排查指南:从入门到精通
1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice自定义Word模版中的数据区域
PageOffice 国产版 :支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(Mips、LoogArch)芯片架构。 在实际的Wor…...

基于基金净值百分位的交易策略
策略来源:睿思量化小程序 基金净值百分位,是衡量当前基金净值在过去一段时间内的相对位置。以近一年为例,若某基金净值百分位为30%,意味着过去一年中有30%的时间基金净值低于当前值,70%的时间高于当前值。这一指标犹如…...

2025蓝桥杯JAVA编程题练习Day8
1. 路径 题目描述 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。 小蓝的图由 2021 个结点组成,依次编号 1 至 2021。 对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21࿰…...

通信安全堡垒:profinet转ethernet ip主网关提升冶炼安全与连接
作为钢铁冶炼生产线的安全检查员,我在此提交关于使用profinet转ethernetip网关前后对生产线连接及安全影响的检查报告。 使用profinet转ethernetip网关前的情况: 在未使用profinet转ethernetip网关之前,我们的EtherNet/IP测温仪和流量计与PR…...

DL00219-基于深度学习的水稻病害检测系统含源码
🌾 基于深度学习的水稻病害检测系统 — 智能农业的未来,守护农田的每一寸土地! 🚜 完整系统获取见文末 水稻病害检测,一直是农业领域的一大难题。传统的人工检测不仅耗时耗力,还容易因经验不足导致漏检或误…...
在24GB显存大小的GPU上运行27GB的Pytorch模型
在24GB显存大小的GPU上运行27GB的Pytorch模型 一.背景:显存不足时的破局之道1.1 大模型时代的显存困境1.2 CUDA统一内存的魔法二.性能测试数据深度解读关键发现:三.复现过程3.1 准备自定义分配器3.2 准备测试程序3.3 执行流程3.4 开始测试四.原理深度剖析4.1 统一内存的工作机…...
【数据机构】2. 线性表之“链表”
- 第 97 篇 - Date: 2025 - 05 - 16 Author: 郑龙浩/仟墨 【数据结构 2】 续上一篇 线性表之“顺序表” 文章目录 3 链表(用指针来首位相连)① 基本介绍② 分类 与 变量命名1 )分类:2 )大体介绍不同结构: ③ “单链表” 的实现:*…...

【51单片机中断】
目录 配置流程 1.在IE寄存器中开启总中断通道和需要的某中断通道 2.在TCON寄存器开启所用中断的触发方式 3.使用中断函数完成中断 4.若需要中断嵌套则在IP寄存器中配置 5.若需要使用串口的中断,则配置SCON寄存器 6.代码示例 配置流程 1.在IE寄存器中开启总…...

JavaSE基础语法之方法
方法 一、方法入门 1.方法定义 方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用。 2.方法的格式 修饰符 返回值类型 方法名( 形参列表 ){方法体代码(需要执行的功能代码) }示例: public static int sum ( int a ,…...

华为网路设备学习-22(路由器OSPF-LSA及特殊详解)
一、基本概念 OSPF协议的基本概念 OSPF是一种内部网关协议(IGP),主要用于在自治系统(AS)内部使路由器获得远端网络的路由信息。OSPF是一种链路状态路由协议,不直接传递路由表,而是通过交换链路…...

go-数据库基本操作
1. 配置数据库 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" ) #配置表结构 type User struct {ID int64 json:"id" gorm:"primary_key" // 主键ID自增长Username stringPassword string } #配置连接接信息 func…...
vue 中绑定样式 【style样式绑定】
style样式绑定 在 Vue 中,style 的绑定与 class 类似,也是通过 v-bind:style(或简写 :style)实现的,允许你动态地控制内联样式。Vue 对 style 做了非常智能的处理,支持对象、数组、字符串等多种语法&#…...
印刷业直角坐标型码垛机器人系统设计与应用研究
摘要 随着印刷行业自动化水平的提升,本文针对传统人工码垛存在的效率低、标准化程度不足等问题,提出基于直角坐标系的专用码垛机器人解决方案。重点阐述机械臂结构设计、运动控制系统及智能抓取装置三大核心模块,通过实际应用验证系统在速度、…...

Mysql存储过程(附案例)
文章目录 存储过程概述1、基本语法2、变量①、系统变量②、用户自定义变量③、局部变量 3、流程控制语句①、if语句②、参数③、case语句④、while语句⑤、repeat语句⑥、loop语句⑦、cursor游标⑧、handler 4、存储函数 存储过程概述 存储过程是事先经过编译并存储在数据…...

【Web应用】Vue 项目前端项目文件夹和文件介绍
文章目录 ⭐前言⭐一、文件夹介绍🌟1、.idea🌟2、bin🌟3、build🌟4、node_modules🌟5、public🌟6、src ⭐二、文件介绍🌟1、.editorconfig🌟2、.env.development、.env.production、…...

Stratix 10 FPGA DDR4 选型
文章目录 前言DDR3 和 DDR4 的区别Micron 8Gb DDR4 规格书详解Micron 8Gb DDR4 编码规则ConfigurationDDR4 寻址原理 Speed Grade内存的频率MT/s 与 MHz:更好的内存速度衡量指标为什么 DDR4 的核心频率与 I/O 总线频率的比例是 1:4 呢? 带宽 Altera FPGA…...
Rust 输出到命令行
Rust 输出到命令行 引言 Rust 是一门系统编程语言,以其高性能、内存安全、并发支持和零成本抽象等特性而闻名。在开发过程中,将 Rust 程序的输出传递到命令行是常见的需求。本文将详细介绍 Rust 输出到命令行的多种方法,帮助读者掌握这一技…...
费曼技巧及提高计划
费曼技巧及提高计划 一、什么是费曼技巧? 费曼技巧(Feynman Technique)由诺贝尔物理学奖得主理查德费曼提出,是一种通过“以教代学”来彻底理解复杂概念的学习方法。其核心逻辑是: “如果你不能简单解释一件事&#x…...
扩展:React 项目执行 yarn eject 后的 config 目录结构详解
扩展:React 项目执行 yarn eject 后的 config 目录结构详解 什么是 yarn eject?React 项目执行 yarn eject 后的 config 目录结构详解📁 config 目录结构各文件作用详解env.jsgetHttpsConfig.jsmodules.jspaths.jswebpack.config.jswebpackDe…...

CMU-15445(4)——PROJECT#1-BufferPoolManager-Task#2
PROJECT#1-BufferPoolManager Task #2 - Disk Scheduler 在前一节我实现了 TASK1 并通过了测试,在本节中,我将逐步实现 TASK2。 如上图,Page Table(页表)通过哈希表实现,用于跟踪当前存在于内存中的页&am…...

百度智能云千帆携手联想,共创MCP生态宇宙
5月7日,2025联想创新科技大会(Tech World)在上海世博中心举行,本届大会以“让AI成为创新生产力”为主题。会上,联想集团董事长兼CEO杨元庆展示了包括覆盖全场景的超级智能体矩阵,包括个人超级智能体、企业超…...
Python 中的 typing.ClassVar 详解
一、ClassVar 的定义和基本用途 ClassVar 是 typing 模块中提供的一种特殊类型,用于在类型注解中标记类变量(静态变量)。根据官方文档,使用 ClassVar[…] 注释的属性表示该属性只在类层面使用,不应在实例上赋值 例如&…...

【动态导通电阻】GaN HEMT动态导通电阻的精确测量
2023 年 7 月,瑞士洛桑联邦理工学院的 Hongkeng Zhu 和 Elison Matioli 在《IEEE Transactions on Power Electronics》期刊发表了题为《Accurate Measurement of Dynamic ON-Resistance in GaN Transistors at Steady-State》的文章,基于提出的稳态测量方法,研究了氮化镓(…...

java 使用zxing生成条形码(可自定义文字位置、边框样式)
最新工作中遇到生成条形码的需求,经过一番摸索之后找到了zxing这个工具类,实现效果如下: 首先引入依赖: <!-- 条形码生成器 --><dependency><groupId>com.google.zxing</groupId><artifactId&g…...

day19-线性表(顺序表)(链表I)
一、补充 安装软件命令: sudo apt-get install (软件名) 安装格式化对齐:sudo apt-get install clang-format内存泄漏检测工具: sudo apt-get install valgrind 编译后,使用命令 valgrind ./a.out 即可看内存是…...

CSS- 2.1 实战之图文混排、表格、表单、学校官网一级导航栏
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…...
Armijo rule
非精线搜索步长规则Armijo规则&Goldstein规则&Wolfe规则_armijo rule-CSDN博客 [原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则 – 编码无悔 / Intent & Focused...