【Python进阶】Python网络协议与套接字编程:构建客户端和服务器

1、网络通信基础与网络协议

1.1 网络通信模型概述

网络通信是信息时代基石,它如同现实世界中的邮递系统,将数据从一处传递到另一处。其中,OSI七层模型与TCP/IP四层或五层模型是理解和构建网络通信的基础。

1.1.1 OSI七层模型与TCP/IP四层/五层模型

OSI(开放系统互连)参考模型提出了七层结构,从物理层到应用层,每一层都有其特定的功能和职责,例如物理层关注的是信号如何在介质上传输,而应用层则处理具体的应用程序交互。

相比之下,TCP/IP模型更为简洁实用,通常分为网络接口层、网络层、传输层和应用层四层(也有将其进一步划分为五层,增加会话层和表示层)。TCP/IP模型源于互联网的实际发展,其中IP协议负责网络层寻址和路由选择,TCP协议确保传输层的数据可靠传输。

例如,在发送电子邮件时,应用层(如SMTP协议)负责构造邮件内容,传输层的TCP保证邮件数据有序、无错地传输,而IP协议则负责邮件在全球互联网上的寻址和投递。

1.1.2 主要网络协议层次及其功能

物理层:定义了网络设备之间如何通过电信号、光信号等方式传输原始比特流。
示例代码(非真实代码,仅为示意):

# 假设有一个简单的模拟信号发生器
class SignalGenerator:def transmit_bits(self, bits):# 发送一组比特流到物理媒介pass

数据链路层:封装成帧,错误检测,MAC地址识别等,如以太网协议。
网络层:IP协议在此层工作,主要负责寻址和路由选择,决定数据包从源到目的地的最佳路径。

import socket# 创建一个IP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dest_ip = '192.168.1.1'  # 目标IP地址

传输层:TCP协议提供了面向连接、可靠的传输服务,UDP协议则提供了无连接、不可靠但速度快的数据传输服务。
应用层:HTTP、FTP、SMTP等各种应用程序使用的协议都位于这一层,它们决定了数据的具体形式和用途。
通过这些层层叠叠的协议栈,我们能够构建起丰富多彩的网络应用,无论是网页浏览、文件传输还是实时通讯,都离不开这些基础网络协议的支撑。

1.2 常见网络协议简介

1.2.1 IP协议与路由选择

IP协议如同邮政系统的邮编系统,为每台联网设备分配独一无二的IP地址,并使用路由表指导数据包在网络中寻找到达目的地的最佳路径。比如,当你在网上冲浪时,你的电脑就是通过IP协议将请求发送到全球各地的服务器。

# 获取本地主机IP地址
import socket
local_ip = socket.gethostbyname(socket.gethostname())
print(f"本机IP地址: {local_ip}")

1.2.2 TCP协议与可靠性传输

TCP协议像是一位严谨的快递员,他不仅确保每个包裹都能送达,还确保包裹按顺序到达,如有丢失或损坏,还会重新发送。TCP通过握手建立连接,通过序列号和确认应答保证数据可靠传输。

# Python中创建TCP服务器端
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(('localhost', 12345))  # 绑定本地IP和端口
server_sock.listen(5)  # 开始监听连接请求
conn, addr = server_sock.accept()  # 等待并接受客户端连接
...# 客户端与服务器端之间的数据传输
data = conn.recv(1024)  # 接收数据
conn.sendall(b'ACK! Data received.')  # 向服务器发送确认信息

1.2.3 UDP协议与无连接数据传输

UDP协议则更像一位急性子的投递员,一旦接收到数据就立即投递,不关心是否送达及顺序,因此速度更快,常用于对延迟敏感的应用,如在线视频会议、实时游戏等场景。

# Python中创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = b'Hello, UDP world!'
udp_socket.sendto(message, ('localhost', 5005))  # 发送数据报文到指定地址
data, addr = udp_socket.recvfrom(1024)  # 接收任意来源的数据报文
# 2、Python中的网络编程基础
## 2.1 Python socket模块介绍
### 2.1.1 socket对象的创建与属性
在Python中,socket模块是进行网络编程的核心工具,它提供了一种标准的方式来创建、配置并管理套接字。想象一下,套接字就像是一扇门,允许你的程序接入互联网这条大路,与其他远程主机进行交流。创建一个新的socket对象就像开启这扇门一样简单,你可以根据需要选择不同的地址家族和协议类型。例如,创建一个IPv4环境下的TCP套接字:```python
import socket# 创建一个TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 显示套接字的一些基本信息
print(f"Socket type: {tcp_socket.type}")
print(f"Socket family: {tcp_socket.family}")

2.1.2 Python中的地址家族与协议类型

地址家族:主要包括两种类型,AF_INET(IPv4)和AF_INET6(IPv6),分别对应不同版本的Internet协议地址。
协议类型:主要有两种,SOCK_STREAM(TCP)和SOCK_DGRAM(UDP)。TCP提供面向连接、可靠的数据传输服务;UDP则提供无连接、快速但可能丢包或乱序的数据传输服务。

2.2 Python中的TCP套接字编程

2.2.1 TCP服务器端开发步骤

2.2.1.1 绑定地址与监听连接

首先,服务器需要绑定一个本地地址(IP地址和端口号)来监听客户端的连接请求。例如,我们可以创建一个监听本地8000端口的TCP服务器:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen(5)  # 设置最大挂起连接数为5while True:client_socket, client_address = server_socket.accept()print(f"Accepted connection from {client_address[0]}:{client_address[1]}")# ...此处可以处理来自客户端的数据...
2.2.1.2 接受客户端连接并通信

当有客户端连接时,accept()方法会返回一个新的套接字,用于与该客户端进行单独的数据交换:

# 在新线程中处理客户端连接
def handle_client(client_socket):message = client_socket.recv(1024).decode('utf-8')print(f"Received message: {message}")response = "Echo: " + messageclient_socket.sendall(response.encode('utf-8'))client_socket.close()new_thread = threading.Thread(target=handle_client, args=(client_socket,))
new_thread.start()

2.2.2 TCP客户端编程实践

2.2.2.1 连接到服务器并发送数据

客户端需要知道服务器的地址和端口,然后发起连接请求:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8000)
client_socket.connect(server_address)message = "Hello, Server!"
client_socket.sendall(message.encode('utf-8'))
2.2.2.2 接收服务器响应

客户端接收服务器回传的消息:

response = client_socket.recv(1024).decode('utf-8')
print(f"Received response: {response}")
client_socket.close()

2.3 Python中的UDP套接字编程

2.3.1 UDP服务器与客户端的特点

UDP是一种无连接协议,服务器无需预先建立连接就可以直接发送和接收数据报文。这意味着效率更高,但同时也失去了TCP提供的诸如流量控制、拥塞控制和错误校验等功能。

2.3.2 实现UDP服务器与客户端通信

2.3.2.1 数据报的发送与接收

在UDP服务器端,我们不需要调用listen()和accept(),而是直接recvfrom()和sendto():

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 9000))while True:data, address = server_socket.recvfrom(1024)message = data.decode('utf-8')print(f"Received message from {address}: {message}")reply = f"Echo: {message}"server_socket.sendto(reply.encode('utf-8'), address)

对于UDP客户端,同样只需指定目标地址就能发送数据:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = "Hello, UDP Server!"
client_socket.sendto(message.encode('utf-8'), ('localhost', 9000))reply, server_address = client_socket.recvfrom(1024)
print(f"Received reply: {reply.decode('utf-8')}")
2.3.2.2 处理无连接性带来的问题

由于UDP的无连接特性,我们需要自行处理数据包丢失、乱序和重复等问题。例如,可以通过添加自定义消息头包含序列号和时间戳来进行排序和去重。

3、高级套接字编程特性与实践

3.1 非阻塞IO与事件驱动模型

3.1.1 select模块与epoll机制

在传统的网络编程中,如果一个套接字处于阻塞模式,那么在等待数据到来或数据发送完成的过程中,程序将暂停执行其他任务。然而,在高性能网络应用中,非阻塞IO和事件驱动模型成为主流,使得程序能够在等待网络事件的同时处理其他任务。

Python的select模块提供了一种机制,让程序可以同时监控多个套接字,查看是否有读写事件发生。例如,我们可以用select.select()函数来监听多个套接字的可读状态:

import selectsockets_list = [server_socket, client_socket1, client_socket2]
readable, writable, exceptional = select.select(sockets_list, [], [])for s in readable:if s is server_socket:# 接受新的连接请求...else:# 从已连接的客户端读取数据...

而在Linux环境中,epoll机制提供了更高的性能和更大的灵活性。虽然Python标准库并未直接支持epoll,但我们可以通过第三方库如selectors来访问这种高效的方法:

import selectorssel = selectors.DefaultSelector()
sel.register(server_socket, selectors.EVENT_READ)while True:events = sel.select()for key, mask in events:if key.fileobj is server_socket:# 处理新的连接请求...else:# 从已注册的套接字读取数据...

3.1.2 使用asyncio模块实现异步I/O

Python 3引入的asyncio模块进一步提升了网络编程的效率和代码可读性,通过协程(coroutine)和事件循环(event loop)机制,实现了高度并发的异步I/O。下面是一个使用asyncio创建TCP服务器的例子:

import asyncioasync def handle_client(reader, writer):data = await reader.read(100)message = data.decode()print(f"Received: {message}")reply = "World!"writer.write(reply.encode())await writer.drain()writer.close()async def main():server = await asyncio.start_server(handle_client, 'localhost', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())

3.2 SSL/TLS安全套接字编程

3.2.1 加密通信的重要性

在网络通信中,数据的安全至关重要。SSL(Secure Sockets Layer)和其继任者TLS(Transport Layer Security)协议为网络通信提供了端到端的加密保护,防止数据被窃听、篡改或伪造身份。

3.2.2 Python中实现SSL加密的套接字

Python内置了对SSL/TLS的支持,通过ssl模块可以很容易地为套接字添加加密功能。以下是一个使用SSL加密的TCP服务器端例子:

import ssl
import socketcontext = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="server.crt", keyfile="server.key")bindsocket = socket.socket()
bindsocket.bind(('localhost', 10023))
bindsocket.listen(5)while True:newsocket, fromaddr = bindsocket.accept()connstream = context.wrap_socket(newsocket, server_side=True)try:deal_with_client(connstream)finally:connstream.shutdown(socket.SHUT_RDWR)connstream.close()

4、实战案例分析

4.1 使用Python构建简易聊天室应用

4.1.1 设计服务器端逻辑

在构建一个简易聊天室应用时,服务器端的核心任务是维护用户列表、监听客户端连接、转发消息以及管理断开连接。首先,服务器需要创建一个监听特定端口的TCP套接字,等待客户端连接。当有客户端连接时,服务器为其创建一个新的线程或进程进行独立通信,并将新客户端加入到用户列表中。每当接收到客户端发送的消息时,服务器都需要广播给所有已连接的客户端。

import socket
import threadingclass ChatServer:def __init__(self, host='localhost', port=5000):self.host = hostself.port = portself.clients = []self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server_socket.bind((self.host, self.port))self.server_socket.listen(5)def broadcast_message(self, message, sender):for client in self.clients:if client != sender:client.sendall(message)def handle_client(self, client_socket):while True:try:message = client_socket.recv(1024)if not message:breakself.broadcast_message(message, client_socket)except Exception as e:breakclient_socket.close()self.clients.remove(client_socket)def run(self):while True:client, addr = self.server_socket.accept()print(f"New connection from {addr}")self.clients.append(client)client_handler = threading.Thread(target=self.handle_client, args=(client,))client_handler.start()if __name__ == "__main__":server = ChatServer()server.run()

4.1.2 开发客户端程序

客户端程序则需创建一个套接字,连接到服务器,并在一个循环中接收用户的输入,将其发送给服务器,同时接收并显示服务器转发过来的所有消息。

import socket
import sysdef chat_client(host, port):client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect((host, port))while True:user_input = input("Enter your message (type 'exit' to quit): ")if user_input.lower() == 'exit':breakclient_socket.sendall(user_input.encode())message = client_socket.recv(1024).decode()print(f"Received: {message}")client_socket.close()if __name__ == "__main__":if len(sys.argv) != 3:print("Usage: python chat_client.py <hostname> <port>")else:host = sys.argv[1]port = int(sys.argv[2])chat_client(host, port)

4.2 构建小型HTTP服务器与客户端

4.2.1 HTTP协议基础回顾

HTTP(HyperText Transfer Protocol)是一种应用层协议,主要用于分布式超媒体信息系统。它采用请求-响应模型,通过GET、POST等多种方法在客户端与服务器之间交换数据。

4.2.2 使用Python实现HTTP服务器

Python内置的http.server模块可以轻松创建一个简单的HTTP服务器,用来服务静态资源或处理简单的HTTP请求:

import http.server
import socketserverPORT = 8000Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print(f"Serving at port {PORT}...")httpd.serve_forever()

4.2.3 编写简易HTTP客户端

尽管Python标准库没有提供直接创建HTTP客户端的模块,但可以利用requests库编写简单高效的HTTP客户端,发送GET或POST请求:

import requestsdef http_get_example(url):response = requests.get(url)if response.status_code == 200:return response.textelse:return "Error: {}".format(response.status_code)url = "http://example.com"
print(http_get_example(url))

5、网络编程中的挑战与优化

5.1 并发处理与性能优化

5.1.1 多线程与多进程并发模型

在网络编程中,处理并发请求的能力至关重要。多线程编程允许多个线程在同一进程中运行,共享同一块内存空间,从而实现并发处理。例如,在Python中,我们可以创建一个线程池来同时处理多个客户端连接:

import concurrent.futures
import socketdef handle_connection(client_socket):# 读取和处理客户端数据...def create_server(host, port):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(5)with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:while True:client_socket, addr = server_socket.accept()executor.submit(handle_connection, client_socket)create_server('localhost', 12345)

多进程并发模型则为每个请求启动一个新的进程,进程间各自拥有独立的内存空间,降低了数据竞争的风险。Python的multiprocessing模块可以帮助我们实现这一模式:

import multiprocessing
import socketdef handle_connection(client_socket):# 读取和处理客户端数据...def create_server(host, port):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(5)while True:client_socket, addr = server_socket.accept()p = multiprocessing.Process(target=handle_connection, args=(client_socket,))p.start()create_server('localhost', 12345)

5.1.2 错误处理与异常恢复策略

在复杂的网络环境中,各种未知错误和异常情况难以避免。优秀的网络程序应当具备健全的错误处理和恢复机制。例如,当网络中断、套接字关闭或者数据传输过程中出现错误时,程序应能够优雅地捕获异常,并尝试重新连接或通知用户:

try:# 连接至服务器或读取数据...
except ConnectionRefusedError:print("无法连接至服务器,请检查网络或服务器状态.")
except BrokenPipeError:print("通信管道已破裂,尝试重新连接...")# 重新连接逻辑
except Exception as e:print(f"遇到未知错误: {e}")# 其他错误处理及日志记录
finally:# 关闭网络资源,释放套接字...

5.2 网络编程的最佳实践与设计模式

5.2.1 代码复用与模块化设计

为了提高代码质量和可维护性,网络编程中提倡模块化设计。例如,可以将TCP/UDP服务器和客户端的创建、数据处理等部分抽象为独立模块,以便在不同项目中复用:

# tcp_server.py 模块
def start_tcp_server(host, port, handler_func):# 创建服务器、监听连接、调用handler_func处理客户端连接...# client_communication.py 模块
def connect_to_server(host, port, send_data, receive_response):# 连接到服务器、发送数据、接收响应...

5.2.2 日志记录与调试技巧

在实际开发中,日志记录是追踪程序行为、排查问题的重要手段。Python的logging模块提供了丰富的日志记录功能,可以根据需求设置不同级别的日志输出,方便跟踪网络通信过程:

import logginglogging.basicConfig(filename='network.log', level=logging.DEBUG)
logger = logging.getLogger(__name__)def handle_connection(client_socket):try:# 读取和处理客户端数据...except Exception as e:logger.exception(f"处理客户端连接时出错: {e}")

通过合理利用并发模型、精心设计错误处理机制、坚持模块化编码及有效日志记录,网络编程的挑战得以化解,程序性能和稳定性得到显著提升。这些最佳实践不仅适用于Python网络编程,也是软件工程中通用的原则。

6、扩展阅读与未来趋势

6.1 Python网络编程框架介绍

6.1.1 Flask、Django等Web框架中的网络通信

Flask 和 Django 是 Python 中极为流行的 Web 开发框架,它们极大地简化了网络通信的实现过程。Flask 以其轻量级和灵活著称,适合快速开发小规模应用和服务。下面是一个使用 Flask 构建基本 Web 服务器的简单示例:

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

Django 则是一个功能完备的 MVC 框架,适用于构建大型企业级应用。Django 提供了强大的 ORM 对象关系映射、自动化的管理后台、URL 分发机制和模板引擎等功能,使其在网络通信方面具有极高的效率和便捷性。

6.1.2 Twisted、asyncio与其他异步框架

Twisted 是 Python 中老牌的异步网络编程框架,特别适合开发高性能、低延迟的服务,如即时通信、网络游戏服务器等。Twisted 支持多种协议,包括但不限于 TCP、UDP、HTTP、SSH、FTP 等。

from twisted.internet import protocol, reactorclass EchoProtocol(protocol.Protocol):def dataReceived(self, data):self.transport.write(data)class EchoFactory(protocol.Factory):def buildProtocol(self, addr):return EchoProtocol()reactor.listenTCP(12345, EchoFactory())
reactor.run()

asyncio 是 Python 标准库的一部分,用于实现异步 I/O,尤其是在 Python 3.5 及以后版本中得到了极大的改进和发展。通过 async/await 关键字,asyncio 可以轻松构建异步网络服务:

import asyncioasync def handle_echo(reader, writer):data = await reader.read(100)message = data.decode()print(f"Received: {message}")writer.write(data)await writer.drain()writer.close()async def main():server = await asyncio.start_server(handle_echo, 'localhost', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())

6.2 IoT、云计算与微服务架构下的网络编程

6.2.1 MQTT、CoAP等物联网协议的应用

MQTT(Message Queuing Telemetry Transport)是一种轻量级发布/订阅消息协议,特别适合物联网设备间的低带宽、不稳定网络环境下的通信。在Python中,我们可以使用paho-mqtt库实现MQTT客户端与服务器的交互:

import paho.mqtt.client as mqttdef on_connect(client, userdata, flags, rc):print("Connected with result code "+str(rc))def on_message(client, userdata, msg):print(msg.topic+" "+str(msg.payload))client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_messageclient.connect("mqtt.eclipseprojects.io", 1883, 60)
client.subscribe("topic/test")client.loop_forever()

CoAP(Constrained Application Protocol)则是另一种专为资源受限的IoT设备设计的协议,它基于RESTful架构理念,提供类似HTTP的交互方式。Python中有coapthon库支持CoAP协议的编程实现。

6.2.2 服务间通信与API设计原则

在云计算和微服务架构下,服务间通信往往依赖于REST API或者gRPC等高级通信协议。遵循诸如接口简洁、幂等性、分层系统、统一接口风格等API设计原则,能够确保服务间通信的稳定性和一致性。

例如,使用FastAPI框架设计RESTful API:

from fastapi import FastAPIapp = FastAPI()@app.post("/items/")
async def create_item(item: dict):# 存储或处理item数据return {"item_id": "new-item-id"}

总之,Python网络编程框架和现代通信协议的发展,正不断推动着网络通信技术的进步,也为开发者提供了更加强大、高效和灵活的工具。随着新技术的涌现和成熟,Python将继续在云服务、物联网和分布式系统等领域发挥重要作用。

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

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

相关文章

Redis - 哨兵(Sentinel)

Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#xff0c;需要⼈⼯进⾏主从切换&#xff0c;同时⼤量 的客⼾端需要被通知切换到新的主节点上&#xff0c;对于上了⼀定规模的应⽤来说&#xff0c;这种⽅案是⽆法接受的&#xff0c; 于是Redis从2.8开始提…

UE5 metahuman 头发物理模拟

https://www.youtube.com/watch?vyYmdgtP6cQA 头发梳理物理 打开Unreal Engine&#xff0c;选择一个角色模型 点击“Groom”选项卡&#xff0c;在“Physics”部分下&#xff0c;找到“Custom Solver”&#xff0c;点击下拉菜单&#xff0c;选择“WindDrivenSystem”。 在“…

大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)

大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL&#xff08;Extract, Transform, Load&#xff09;1.2 Flume 概述 2. Flume 环境搭建2.1 下载并安装 Flume2.2 启动 Flume 3. Flume 配置和常见 Source、Sink、Channel3.1 Flume Source3.2 Flume Si…

24年配置CUDA12.4,Pytorch2.5.1,CUDAnn9.5运行环境

没什么好介绍的&#xff0c;直接说了。 下载 首先打开命令行&#xff0c;输入代码查看显卡最高支持的cuda版本&#xff0c;下载的版本不要高于该版本 nvidia-smi PyTorch 插件这个是PyTorch下载地址&#xff0c;就按照我这么选CUDA版本就选最新的&#xff0c;看好绿框里的CU…

架构师备考-概念背诵(系统架构)

软件架构概念 一个程序和计算系统软件体系结构是指系统的一个或者多个结构。结构中包括软件的构件,构件的外部可见属性以及它们之间的相互关系。体系结构并非可运行软件。确切地说,它是一种表达,使软件工程师能够: (1)分析设计在满足所规定的需求方面的有效性:(2)在设计变…

Linux服务器软件包管理的使用

在 Linux 系统中&#xff0c;软件包管理器是用于安装、升级、删除和管理软件包的工具。不同的 Linux 发行版使用不同的软件包管理器&#xff0c;通常根据使用的包格式和包管理系统&#xff08;如 .deb 或 .rpm&#xff09;来区分。下面将介绍几种常见的 Linux 软件包管理器及其…

debian系统安装qt的时候 显示xcb相关文件缺失

如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…

esp32s3连接控制HC-08蓝牙设备

趁双十一买了一块esp32S3单片,尝试之后发现他的蓝牙只支持ble,我的机器人以前是使用手机控制的,我想借此机会,为他添加一个esp32S3的大脑。 查了一下资料,写了一个demo,记录一下代码: #include "BLEDevice.h" //#include "BLEScan.h" //hc-08的ble…

WordPress文章自动提交Bing搜索引擎:PHP推送脚本教程

随着网站SEO优化的重要性日益增加,将新发布的内容快速提交到搜索引擎显得尤为重要。尤其对于Bing站长平台,自动化推送能让Bing尽快发现和索引我们网站的新内容。本文将详细介绍如何通过PHP脚本自动推送WordPress当天发布的文章至Bing站长平台,确保新文章被Bing及时收录。 前…

指令重排序:Java程序中的隐秘优化

什么是重排序&#xff1f; 在编写Java程序时&#xff0c;我们通常会期望代码的执行顺序与编写顺序一致。然而&#xff0c;为了优化性能&#xff0c;编译器、JVM或CPU可能会对指令的实际执行顺序进行调整&#xff0c;这种现象被称为重排序。重排序是现代计算机系统中常见的优化…

开源大模型推理引擎现状及常见推理优化方法总结

原文&#xff1a;https://zhuanlan.zhihu.com/p/755874470 前言 前一段时间sglang-v0.3.0和vllm-v0.6.0前后脚发布之后&#xff0c;就一直想总结梳理一下现在主流的大模型推理引擎。因为我觉得这也算是一个有意义的节点吧&#xff0c;从此开源大模型推理引擎总算是由"非…

【信号处理】绘制IQ信号时域图、星座图、功率谱

时域图 # 导入相关的库 import pickle import matplotlib.pyplot as plt import numpy as np from pathlib import Path import oswith open(r"C:\0-数据集\公开\RML2016\RML2016.10a_dict.pkl", rb) as file:Xd pickle.load(file, encodingbytes) snrs, mods map…

第 1 章 - Go语言简介

第 1 章 - Go语言简介 1.1 什么是Go语言 Go语言&#xff0c;又称 Golang&#xff0c;是一种静态类型的编译型语言&#xff0c;由 Google 公司的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年开始设计&#xff0c;并在 2009 年正式对外发布。Go 语言的设计目标是提…

C++优选算法十二 栈

在C中&#xff0c;stack 是一种标准模板库&#xff08;STL&#xff09;容器适配器&#xff0c;它提供了后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构。stack 适配器基于其他底层容器&#xff08;如 deque 或 vector&#xff09;来实现&#xff0c;但只提…

找工作就上万码优才,海量技术岗位等你来

已至岁末&#xff0c;不论你将实习&#xff0c;或正在求职&#xff0c;求职平台千千万万&#xff0c;但简历如落叶般无人问津。 是否因未找到理想职位而心生焦虑&#xff1f;别急&#xff0c;万码优才在这里&#xff0c;为你点亮职业之路的明灯&#xff01; 今天给大家推荐一…

⭐SmartControl: Enhancing ControlNet for Handling Rough Visual Conditions

目录 0 Abstract 1 Motivation 2 Related Work 2.1 Text-to-Image Diffusion Model 2.2 Controllable Text-to-Image Generation 2.3 ControlNet 2.4 Control Scale Exploration 3 Method 3.1 Framework 3.2 Control Scale Predictor 3.3 Unaligned Data Constructi…

Vue数据响应式原理

前言 Vue是一个结构的框架,也就是 数据层、视图层、数据-视图层&#xff1b;响应式的原理就是实现当数据更新时&#xff0c;视图层也要相应的更新 响应式实现 基于发布订阅模式和数据劫持实现 1.发布订阅模式&#xff1a;vue使用发布订阅模式来实现数据变动的通知和更新 2…

python函数小练习(三)

main.py import testwhile True:test.kdc_menu()ch int(input("请选择>>"))match ch:case 1:test.show_menu()case 2:test.sale_menu()case 3:test.money_menu()case 4:test.mess_menu()case -1:breakcase _:print("请重新输入")test.py menu {…

vue3 + element-plus 的 upload + axios + django 文件上传并保存

之前在网上搜了好多教程&#xff0c;一直没有找到合适自己的&#xff0c;要么只有前端部分没有后端&#xff0c;要么就是写的不是很明白。所以还得靠自己摸索出来后&#xff0c;来此记录一下整个过程。 其实就是不要用默认的 action&#xff0c;要手动实现上传方式 http-reque…

更改Ubuntu22.04锁屏壁纸

更改Ubuntu22.04锁屏壁纸 sudo apt install gnome-shell-extensions gnome-shell-extension-manager安装Gnome Shell 扩展管理器后&#xff0c;打开“扩展管理器”并使用搜索栏找到“锁屏背景”扩展