Python网络通信:从基础到高级应用

Python网络通信:从基础到高级应用

1. 引言

在当今互联网时代,网络通信已经成为现代软件开发中不可或缺的一部分。Python作为一种versatile编程语言,提供了丰富的网络编程库和工具,使得开发者能够轻松地构建各种网络应用。本文将深入探讨Python网络通信的方方面面,从基础的套接字编程到高级的异步网络框架,帮助您全面掌握Python网络编程技能。

2. 网络基础知识

在深入Python网络编程之前,我们需要先了解一些基本的网络概念。

2.1 OSI模型

OSI(Open Systems Interconnection)模型是一个用于理解网络通信的概念性框架,它包含7层:

  1. 物理层
  2. 数据链路层
  3. 网络层
  4. 传输层
  5. 会话层
  6. 表示层
  7. 应用层

Python网络编程主要关注上层(传输层及以上)。

2.2 TCP/IP协议族

TCP/IP是互联网的基础协议族,包括:

  • IP(Internet Protocol):负责数据包的寻址和路由
  • TCP(Transmission Control Protocol):提供可靠的、面向连接的数据传输
  • UDP(User Datagram Protocol):提供不可靠的、无连接的数据传输

2.3 端口号

端口号是用于区分同一台计算机上不同网络服务的数字标识符,范围从0到65535。

3. Python套接字编程

套接字(Socket)是网络编程的基础,它提供了一种跨网络通信的端点。

3.1 创建TCP套接字

以下是一个简单的TCP服务器和客户端示例:

服务器端代码:

import socketdef start_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('localhost', 12345))server_socket.listen(1)print("Server is listening on port 12345")while True:client_socket, address = server_socket.accept()print(f"Connection from {address} has been established!")client_socket.send(bytes("Welcome to the server!", "utf-8"))client_socket.close()if __name__ == "__main__":start_server()

客户端代码:

import socketdef connect_to_server():client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('localhost', 12345))message = client_socket.recv(1024)print(message.decode("utf-8"))client_socket.close()if __name__ == "__main__":connect_to_server()

3.2 创建UDP套接字

UDP通信不需要建立连接,这里是一个简单的UDP服务器和客户端示例:

服务器端代码:

import socketdef start_udp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_socket.bind(('localhost', 12345))print("UDP server is listening on port 12345")while True:message, address = server_socket.recvfrom(1024)print(f"Message from {address}: {message.decode('utf-8')}")server_socket.sendto(b"Message received", address)if __name__ == "__main__":start_udp_server()

客户端代码:

import socketdef send_udp_message():client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)client_socket.sendto(b"Hello, UDP Server!", ('localhost', 12345))response, _ = client_socket.recvfrom(1024)print(f"Response from server: {response.decode('utf-8')}")client_socket.close()if __name__ == "__main__":send_udp_message()

4. HTTP通信

HTTP是应用层协议,广泛用于Web应用。Python提供了多种方式来处理HTTP通信。

4.1 使用requests库

requests库是Python中最流行的HTTP客户端库之一。

安装:

pip install requests

使用示例:

import requestsdef get_example():response = requests.get('https://api.github.com/events')print(response.status_code)print(response.json())def post_example():data = {'key': 'value'}response = requests.post('https://httpbin.org/post', data=data)print(response.text)if __name__ == "__main__":get_example()post_example()

4.2 使用http.server模块

Python的标准库提供了http.server模块,可以快速创建一个简单的HTTP服务器:

from http.server import HTTPServer, SimpleHTTPRequestHandler
import socketserverdef run_server(port=8000):handler = SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", port), handler) as httpd:print(f"Serving at port {port}")httpd.serve_forever()if __name__ == "__main__":run_server()

这个服务器将serve当前目录下的文件。

5. 异步网络编程

异步编程允许同时处理多个网络连接,提高程序的效率。

5.1 使用asyncio

asyncio是Python的异步编程标准库。

异步HTTP客户端示例:

import asyncio
import aiohttpasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():async with aiohttp.ClientSession() as session:html = await fetch(session, 'http://python.org')print(html[:100])if __name__ == "__main__":asyncio.run(main())

异步HTTP服务器示例:

from aiohttp import webasync def handle(request):name = request.match_info.get('name', "Anonymous")text = f"Hello, {name}!"return web.Response(text=text)app = web.Application()
app.add_routes([web.get('/', handle),web.get('/{name}', handle)])if __name__ == '__main__':web.run_app(app)

6. 网络协议实现

Python可以用来实现各种网络协议。这里我们以SMTP(Simple Mail Transfer Protocol)为例。

6.1 使用smtplib发送邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Headerdef send_email():sender = 'from@example.com'receivers = ['to@example.com']message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')message['From'] = Header("菜鸟教程", 'utf-8')message['To'] =  Header("测试", 'utf-8')subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8')try:smtpObj = smtplib.SMTP('localhost')smtpObj.sendmail(sender, receivers, message.as_string())print("邮件发送成功")except smtplib.SMTPException:print("Error: 无法发送邮件")if __name__ == "__main__":send_email()

7. 网络安全

在进行网络编程时,安全性是一个重要的考虑因素。

7.1 使用SSL/TLS

Python的ssl模块提供了对SSL/TLS的支持。以下是一个使用SSL的TCP客户端示例:

import ssl
import socketdef ssl_client():context = ssl.create_default_context()with socket.create_connection(('www.python.org', 443)) as sock:with context.wrap_socket(sock, server_hostname='www.python.org') as secure_sock:print(f"Connected to {secure_sock.version()}")secure_sock.send(b"GET / HTTP/1.1\r\nHost: www.python.org\r\n\r\n")print(secure_sock.recv(1024))if __name__ == "__main__":ssl_client()

7.2 处理网络攻击

在网络编程中,我们需要注意防范各种攻击,如DDoS攻击、SQL注入等。以下是一个简单的IP黑名单实现:

import socket
from collections import defaultdictclass IPBlocker:def __init__(self, max_attempts=5):self.ip_attempts = defaultdict(int)self.max_attempts = max_attemptsdef check_ip(self, ip):if self.ip_attempts[ip] >= self.max_attempts:return Falseself.ip_attempts[ip] += 1return Truedef start_server():blocker = IPBlocker()server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('localhost', 12345))server_socket.listen(1)print("Server is listening on port 12345")while True:client_socket, address = server_socket.accept()ip = address[0]if blocker.check_ip(ip):print(f"Connection from {address} has been established!")client_socket.send(bytes("Welcome to the server!", "utf-8"))else:print(f"Connection from {address} has been blocked!")client_socket.send(bytes("You have been blocked due to too many attempts.", "utf-8"))client_socket.close()if __name__ == "__main__":start_server()

8. 高级网络编程技巧

8.1 使用Twisted框架

Twisted是一个事件驱动的网络编程框架,适用于开发复杂的网络应用。

安装Twisted:

pip install twisted

一个简单的Twisted echo服务器:

from twisted.internet import protocol, reactor, endpointsclass Echo(protocol.Protocol):def dataReceived(self, data):self.transport.write(data)class EchoFactory(protocol.Factory):def buildProtocol(self, addr):return Echo()endpoints.serverFromString(reactor, "tcp:1234").listen(EchoFactory())
reactor.run()

8.2 使用gevent进行协程编程

gevent是一个基于协程的Python网络库,它使用greenlet来提供高级同步API。

安装gevent:

pip install gevent

使用gevent实现并发下载:

import gevent
from gevent import monkey
monkey.patch_all()  # 修补所有可能的阻塞
import requestsdef download(url):print(f'Downloading {url}')response = requests.get(url)print(f'Downloaded {len(response.content)} bytes from {url}')urls = ['https://www.python.org/','https://www.yahoo.com/','https://www.github.com/',
]jobs = [gevent.spawn(download, url) for url in urls]
gevent.joinall(jobs)

9. 网络监控和分析

Python也可以用于网络监控和分析。

9.1 使用scapy进行网络嗅探

scapy是一个强大的交互式数据包操作程序和库。

安装scapy:

pip install scapy

一个简单的数据包嗅探器:

from scapy.all import *def packet_callback(packet):if packet[TCP].payload:mypacket = str(packet[TCP].payload)if 'user' in mypacket.lower() or 'pass' in mypacket.lower():print(f"[*] Destination: {packet[IP].dst}")print(f"[*] {str(packet[TCP].payload)}")sniff(filter="tcp port 110 or tcp port 25 or tcp port 143", prn=packet_callback, store=0)

注意:使用网络嗅探工具时,请确保你有合法权限。

9.2 使用psutil监控网络连接

psutil是一个跨平台库,用于获取运行进程和系统利用率(CPU、内存、磁盘、网络等)的信息。

安装psutil:

pip install psutil

监控网络连接:

import psutildef monitor_connections():for conn in psutil.net_connections():print(f"Local address: {conn.laddr}")print(f"Remote address: {conn.raddr}")print(f"Status: {conn.status}")print("---")if __name__ == "__main__":monitor_connections()

10. 网络应用实例

让我们通过一个更复杂的例子来综合运用我们学到的知识。我们将创建一个简单的聊天服务器和客户端。

10.1 聊天服务器

import asyncio
import websockets
import jsonclass ChatServer:def __init__(self):self.clients = set()async def register(self, ws):self.clients.add(ws)print(f"New client connected. Total clients: {len(self.clients)}")async def unregister(self, ws):self.clients.remove(ws)print(f"Client disconnected. Total clients: {len(self.clients)}")async def broadcast(self, message):if self.clients:await asyncio.wait([client.send(message) for client in self.clients])async def ws_handler(self, websocket, path):await self.register(websocket)try:async for message in websocket:data = json.loads(message)await self.broadcast(json.dumps({"type": "message", "user": data['user'], "message": data['message']}))finally:await self.unregister(websocket)server = ChatServer()start_server = websockets.serve(server.ws_handler, "localhost", 8765)asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

10.2 聊天客户端

import asyncio
import websockets
import json
import aioconsoleasync def receive_messages(websocket):while True:try:message = await websocket.recv()data = json.loads(message)print(f"\n{data['user']}: {data['message']}")except websockets.exceptions.ConnectionClosed:print("Connection to server closed")breakasync def send_messages(websocket, username):while True:message = await aioconsole.ainput()await websocket.send(json.dumps({"user": username, "message": message}))async def chat_client():uri = "ws://localhost:8765"async with websockets.connect(uri) as websocket:username = input("Enter your username: ")print(f"Connected to chat server as {username}")receive_task = asyncio.create_task(receive_messages(websocket))send_task = asyncio.create_task(send_messages(websocket, username))await asyncio.gather(receive_task, send_task)asyncio.get_event_loop().run_until_complete(chat_client())

这个聊天应用展示了如何使用WebSocket进行实时双向通信,以及如何使用asyncio处理并发操作。

11. 网络性能优化

在开发网络应用时,性能优化是一个重要的考虑因素。以下是一些优化技巧:

11.1 使用连接池

对于频繁创建和关闭连接的应用,使用连接池可以显著提高性能。以下是使用aiohttp的连接池示例:

import asyncio
import aiohttpasync def fetch_url(session, url):async with session.get(url) as response:return await response.text()async def main():urls = ['http://example.com', 'http://example.org', 'http://example.net'] * 100connector = aiohttp.TCPConnector(limit=20)  # 限制并发连接数async with aiohttp.ClientSession(connector=connector) as session:tasks = [fetch_url(session, url) for url in urls]responses = await asyncio.gather(*tasks)print(f"Fetched {len(responses)} URLs")asyncio.run(main())

11.2 使用缓存

对于频繁访问的数据,使用缓存可以减少网络请求,提高响应速度。以下是一个使用functools.lru_cache的简单缓存示例:

import requests
from functools import lru_cache@lru_cache(maxsize=100)
def fetch_url(url):response = requests.get(url)return response.text# 使用缓存的函数
print(fetch_url('http://example.com'))
print(fetch_url('http://example.com'))  # 这次会从缓存中获取

11.3 压缩数据

在网络传输中,压缩数据可以减少带宽使用并提高传输速度。以下是一个使用gzip压缩的示例:

import gzip
import requestsdef send_compressed_data(url, data):compressed_data = gzip.compress(data.encode('utf-8'))headers = {'Content-Encoding': 'gzip'}response = requests.post(url, data=compressed_data, headers=headers)return response# 使用压缩发送数据
response = send_compressed_data('http://example.com/api', 'Large amount of data...')
print(response.status_code)

12. 网络安全进阶

12.1 实现简单的加密通信

使用Python的cryptography库实现加密通信:

from cryptography.fernet import Fernetdef generate_key():return Fernet.generate_key()def encrypt_message(message, key):f = Fernet(key)return f.encrypt(message.encode())def decrypt_message(encrypted_message, key):f = Fernet(key)return f.decrypt(encrypted_message).decode()# 使用示例
key = generate_key()
message = "Hello, secure world!"
encrypted = encrypt_message(message, key)
decrypted = decrypt_message(encrypted, key)print(f"Original: {message}")
print(f"Encrypted: {encrypted}")
print(f"Decrypted: {decrypted}")

12.2 实现简单的身份验证

使用JWT(JSON Web Tokens)实现简单的身份验证:

import jwt
import datetimeSECRET_KEY = 'your-secret-key'def generate_token(username):payload = {'username': username,'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)}return jwt.encode(payload, SECRET_KEY, algorithm='HS256')def verify_token(token):try:payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])return payload['username']except jwt.ExpiredSignatureError:return 'Token expired'except jwt.InvalidTokenError:return 'Invalid token'# 使用示例
token = generate_token('user123')
print(f"Generated token: {token}")
print(f"Verified username: {verify_token(token)}")

13. 分布式系统和微服务

Python也可以用于构建分布式系统和微服务架构。

13.1 使用gRPC进行服务间通信

gRPC是一个高性能、开源和通用的RPC框架。以下是一个简单的gRPC服务器和客户端示例:

服务器:

import grpc
from concurrent import futures
import time
import hello_pb2
import hello_pb2_grpcclass Greeter(hello_pb2_grpc.GreeterServicer):def SayHello(self, request, context):return hello_pb2.HelloReply(message=f"Hello, {request.name}!")def serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)server.add_insecure_port('[::]:50051')server.start()try:while True:time.sleep(86400)except KeyboardInterrupt:server.stop(0)if __name__ == '__main__':serve()

客户端:

import grpc
import hello_pb2
import hello_pb2_grpcdef run():with grpc.insecure_channel('localhost:50051') as channel:stub = hello_pb2_grpc.GreeterStub(channel)response = stub.SayHello(hello_pb2.HelloRequest(name='World'))print("Greeter client received: " + response.message)if __name__ == '__main__':run()

13.2 使用Celery进行任务队列

Celery是一个分布式任务队列,可以用于处理大量消息。以下是一个简单的Celery任务示例:

from celery import Celeryapp = Celery('tasks', broker='redis://localhost:6379')@app.task
def add(x, y):return x + y# 在另一个Python文件中使用这个任务
from tasks import add
result = add.delay(4, 4)
print(result.get())  # 输出: 8

14. 网络监控和日志分析

14.1 使用ELK栈进行日志分析

ELK栈(Elasticsearch, Logstash, Kibana)是一个强大的日志管理和分析工具集。以下是一个使用Python将日志发送到ELK栈的示例:

import logging
from cmreslogging.handlers import CMRESHandlerhandler = CMRESHandler(hosts=[{'host': 'localhost', 'port': 9200}],auth_type=CMRESHandler.AuthType.NO_AUTH,es_index_name="my_python_index")logger = logging.getLogger("python-logger")
logger.setLevel(logging.INFO)
logger.addHandler(handler)# 使用logger
logger.info("This is a test log message")

14.2 网络流量分析

使用pyshark库进行网络流量分析:

import pysharkdef analyze_traffic(interface):capture = pyshark.LiveCapture(interface=interface)for packet in capture.sniff_continuously(packet_count=10):try:print(f"Source IP: {packet.ip.src}")print(f"Destination IP: {packet.ip.dst}")print(f"Protocol: {packet.transport_layer}")print("---")except AttributeError:passanalyze_traffic('eth0')  # 替换为你的网络接口名称

15. 结语

Python在网络编程领域展现出了强大的versatility和效率。从底层的套接字编程到高级的异步框架,Python提供了丰富的工具和库来满足各种网络通信需求。通过本文的深入探讨,我们不仅掌握了基础的TCP/UDP通信,还学习了HTTP、WebSocket等协议的应用,以及异步编程、安全性和性能优化等高级主题。Python的简洁语法和强大的生态系统使得开发者能够快速构建从简单的网络应用到复杂的分布式系统。随着物联网和云计算的发展,Python的网络编程能力将在未来发挥更加重要的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454929.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API,详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前,先聊一下为什么接口测试在现软件行业如此重要? 为什么我们要学习Postman? 现代软件…

ubuntu 安装keepalived+haproxy

一、安装keepalived sudo apt update sudo apt install keepalived sudo systemctl start keepalived sudo systemctl enable keepalived sudo systemctl status keepalived#配置Keepalived sudo cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf …

Jmeter 实战 JDBC配置

​ JDBC JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API。通过这个API,可以直接连接并执行SQL脚本,与数据库进行交互。 使用JMeter压力测试时,操作数据库的场景 在使用JMeter进行接口压力测试时…

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置 大规模多传感器滑坡检测数据集介绍 数据集概述 名称:大规模多传感器滑坡检测…

R语言建模线性回归

一、 a. # 给定的 (x, y) 数据 x <- c(2, 9, 10, 7) y <- c(3, 13, 12, 11)# 线性回归模型 y a bx model1 <- lm(y ~ x) summary(model1) # 查看回归结果# 提取系数 a 和 b a <- coef(model1)[1] b <- coef(model1)[2]# 预测值 y_pred <- predict(mode…

数据字典是什么?和数据库、数据仓库有什么关系?

一、数据字典的定义及作用 数据字典是一种对数据的定义和描述的集合&#xff0c;它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字典的主要作用如下&#xff1a; 1. 对于数据开发者来说&#xff0c;数据字典包含了关于数据结构和内容的清晰…

【C++篇】探索STL之美:熟悉使用String类

CSDN 文章目录 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&…

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理&#xff0c;消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …

python机器人编程——用python调用API控制wifi小车的实例程序

目录 一、前言二、一个客户端的简单实现2.1 首先定义一个类及属性2.2 其次定义连接方法2.3 定义一些回调函数2.4 定义发送小车指令方法2.5 定义一个正常关闭方法 三、python编程控制小车的demo实现四、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源p…

【保姆级教程】DolphinScheduler本地部署与远程访问详细步骤解析

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

【牛客刷题】笔记2

目录 1、单词搜索 2、岛屿数量 2.1 DFS 2.2 BFS 3、腐烂的橘子 1、单词搜索 单词搜索_牛客题霸_牛客网 (nowcoder.com) 这道题我们就是先遍历数组board&#xff0c;若遇到了与word[0]相等的字符&#xff0c;则以这个字符为起点进行搜索&#xff0c;搜索可以是dfs&#x…

#每日一题#自动化 2024年10月

#每日一题#自动化 2024年10月 1、深拷贝和浅拷贝的区别是什么&#xff1f; 参考答案&#xff1a; 深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中&#xff0c;我们使用 deepcopy&#xff08;&#xff09;函数进行深拷贝…

MyBatis-Plus(二):resultType 的选择——int 与 java.lang.Integer 的区别

resultType 的选择——int 与 java.lang.Integer 的区别 1、概述2、resultType介绍2.1、使用int2.2、使用java.lang.Integer 3、如何选择4、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。…

蘑菇分类识别数据集(猫脸码客 第222期)

蘑菇分类识别文本/图像数据集 蘑菇&#xff0c;作为一种广泛分布于全球的真菌&#xff0c;隶属于伞菌目伞菌亚门蘑菇科蘑菇属&#xff0c;拥有众多别名&#xff0c;如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一&#xff0c;还在许…

Java程序设计:spring boot(8)——API ⽂档构建⼯具 - Swagger2

目录 1 环境整合配置 2 Swagger2 常⽤注解说明 2.1 Api 2.2 ApiOperation 2.3 ApiImplicitParams 2.4 ApiResponses 2.5 ApiModel 3 用户模块注解配置 3.1 Controller 使用注解 3.2 JavaBean 使用注解 4 Swagger2 接⼝⽂档访问 由于 Spring Boot 能够快速开发、便捷…

理解JVM

文章目录 前言一、JVM 内存区域划分二、JVM 中类加载的过程a.类加载的基本流程&#xff08;熟练背诵&#xff09;b.双亲委派模型 三、JVM 中的垃圾回收机制&#xff08;GC&#xff09;1.找到垃圾2.如何回收垃圾&#xff1f; 总结 前言 JVM 内部涉及到的内容是非常广泛的。咱们…

【Qt】Qt的介绍——Qt的概念、使用Qt Creator新建项目、运行Qt项目、纯代码方式、可视化操作、认识对象模型(对象树)

文章目录 Qt1. Qt的概念2. 使用Qt Creator新建项目3. 运行Qt项目3.1 纯代码方式实现3.2 可视化操作实现 4. 认识对象模型&#xff08;对象树&#xff09; Qt 1. Qt的概念 Qt 是一个跨平台的 C 图形用户界面应用程序开发框架。它是软件开发者提供的用于界面开发的程序框架&#…

PCC Net模型实现行人数量统计

关注底部公众号&#xff0c;回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 项目简介 PCC Net是一种用于拥挤场景下行人计数的深度学习模型。该项目的目标是利用神经网络&#xff0c;准确地统计给定区域内的行人数…

Visual Studio Code

代码自动保存 打开设置搜索auto save&#xff0c;设置为afterDelay 设置延迟时间&#xff0c;单位是毫秒 启用Ctrl鼠标滚轮对字体进行缩放 搜索Mouse Wheel Zoom&#xff0c;把该选项勾选上即可

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处&#xff0c;在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis&#xff1a;查找命令的程序文件位置 2、locate&#xff1a;也是一种文件查找&#xff0c;但是基于数据库的查找 3、find&#xff1a;针…