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

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…...

深入浅出之STL源码分析8_三个指针

引言 在第一篇文章 深入浅出之STL源码分析1_vector基本操作-CSDN博客 中有引出了下面的几个问题 1.刚才我提到了我的编译器版本是g 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么?STL安装后我们…...

数据结构(七)——图

一、图的定义与基本术语 1.图的定义 图G由顶点集V和边集E组成,记为G(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)的集合 注意:线性表可以是空表,树可以是空树&…...

养生:打造健康生活的全方位策略

在生活节奏不断加快的当下,养生已成为提升生活质量、维护身心平衡的重要方式。从饮食、运动到睡眠,再到心态调节,各个方面的养生之道共同构建起健康生活的坚实基础。以下为您详细介绍养生的关键要点,助您拥抱健康生活。 饮食养生…...

数据结构(2)线性表-顺序表

知道一个算法的好坏怎么去判断以后,就该正式的去学习一些常见的数据结构,当然,这里的数据结构仅仅是初阶,不会挨个一个一个学完,后期慢慢来。 一、数据结构总论 一般按照逻辑结构和存储结构来分类,在初阶…...

【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

芯片:金线的作用

一、金线的核心作用:互联芯片与外部封装 金线(Gold Wire)在芯片制造中主要用于引线键合(Wire Bonding),这是将芯片(Die)与外部封装引脚(Lead Frame或Substrate&#xff…...

Vue3+uniapp 封装axios

1.第一步在项目根目录新建utils文件夹,里边新建两个文件request.js和uni-api-promisify.js 2.request.js 代码 要安装axios import axios from axios import { showToast } from /utils/uni-api-promisify// 创建axios实例 const service axios.create({baseURL:…...

Nacos源码—9.Nacos升级gRPC分析七

大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 14.gRPC简单介绍 10.gRPC客户端初始化分析 (1)gRPC客户端代理初始化的源码 (2)gRPC客户端启动的源码…...

与智能体高效协作:Kimi交互逻辑探索与提示词设计实践【附kimi提示词合集下载】

引言:智能时代的人机协作新范式 在持续使用多款AI助手完成技术文档分析、数据分析等任务后,我逐渐意识到工具效能的核心不仅在于技术参数,更在于使用者对交互逻辑的理解深度。本文将基于实际项目经验,探讨智能体交互的本质规律&a…...

Web 架构之负载均衡会话保持

文章目录 一、引言二、思维导图三、负载均衡会话保持的概念3.1 定义3.2 作用 四、负载均衡会话保持的实现方式4.1 基于 IP 地址原理代码示例(以 Nginx 为例)注释 4.2 基于 Cookie原理代码示例(以 HAProxy 为例)注释 4.3 基于 SSL …...

遨游卫星电话与普通手机有什么区别?

在数字化浪潮席卷全球的今天,通信设备的角色早已超越传统语音工具,成为连接物理世界与数字世界的核心枢纽。然而,当普通手机在都市丛林中游刃有余时,面对偏远地区、危险作业场景的应急通信需求,其局限性便显露无遗。遨…...

【Redis】谈谈Redis的设计

Redis(Remote Dictionary Service)是一个高性能的内存键值数据库,其设计核心是速度、简单性和灵活性。以下从架构、数据结构、持久化、网络模型等方面解析 Redis 的设计实现原理: 1. 核心设计思想 内存优先:数据主要存…...

聊天项目总结

目前项目 完成了个人信息修改,添加好友,创建群聊,添加群聊,在线状态,删除好友,退出群,解散群,好友申请,群资料修改,群管理,群主转让,…...

智能手表整机装配作业指导书(SOP)

📄 智能手表整机装配作业指导书(SOP) 产品名称:Aurora Watch S1 产品型号:AWS1-BG22 版本号:SOP-AWS1-V1.0 编制日期:2025年5月6日 编制单位:制造工程部(ME)…...

c语言第一个小游戏:贪吃蛇小游戏05

贪吃蛇脱缰自动向右走&#xff1a;脱缰的野蛇 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; void initNcurse() { initscr(); keypad(stdscr,1); } int …...

ES6中的解构

在 JavaScript&#xff08;包括 TypeScript&#xff09;中&#xff0c;数组解构和对象解构是 ES6 引入的两个非常实用的语法特性&#xff0c;它们可以帮助我们更方便地从数组或对象中提取数据。 一、数组解构&#xff08;Array Destructuring&#xff09; &#x1f4cc; 基本用…...

Pycharm的终端执行allure命令出现command not found

Pycharm的接口自动化项目用的是venv虚拟环境&#xff0c;已下载和配置好Allure路径&#xff0c;查看Allure版本正常。 问题&#xff1a;在重新打开Pycham的项目时&#xff0c;在Pycharm终端中执行allure相关命令就会报错zsh: allure: command not found 原因&#xff1a;在PyC…...

[ctfshow web入门] web72

信息收集 下载index.php并查看&#xff0c;和上题差不多 error_reporting(0); ini_set(display_errors, 0); // 你们在炫技吗&#xff1f; if(isset($_POST[c])){$c $_POST[c];eval($c);$s ob_get_contents();ob_end_clean();echo preg_replace("/[0-9]|[a-z]/i",…...

【Folium】使用离线地图

文章目录 相关文献离线地图下载Folium 使用离线地图 相关文献 Folium — Folium 0.19.5 documentationOffline Map Maker 离线地图下载 我们使用 Offline Map Maker 进行地图下载。 特别注意&#xff1a;Folium 默认支持 WGS84 坐标系&#xff0c;建议下载 WGS84 坐标系的地…...

嵌入式自学第二十天(5.13)

&#xff08;1&#xff09;线性表顺序存储的优缺点&#xff1a; 优点&#xff1a;无需为表中逻辑关系添加额外存储空间&#xff1b; 可以快速随机访问元素&#xff0c;时间复杂度O(1)。 缺点&#xff1a;插入删除需要移动元素O(n&#xff09;&#xff1b; 无法动态存储。 …...

ThingsBoard3.9.1 MQTT Topic(4)

本章中的主题适用于网关设备。 1.网关订阅设备属性的topic&#xff1a;v1/gateway/attributes/response 订阅后接收到的响应格式。 { "id":3, "device":"m1", "values":{ "version":"V1.2"…...

centos中JDK_PATH 如何设置

在 CentOS 7.9 中设置 JDK_PATH&#xff08;即 JAVA_HOME&#xff09;的步骤如下。JAVA_HOME 是一个环境变量&#xff0c;用于指向 Java 开发工具包&#xff08;JDK&#xff09;的安装路径。 1. 查找 JDK 安装路径 首先&#xff0c;你需要找到 JDK 的安装路径。可以通过以下命…...

一次讲清 FP32 / FP16 / BF16 / INT8 / INT4

一次讲清 FP32 / FP16 / BF16 / INT8 / INT4 目标&#xff1a;让你3 分钟读懂格式原理&#xff0c;5 分钟学会选型。 只记一句&#xff1a;“指数定范围&#xff0c;尾数定精度&#xff1b;位宽定显存&#xff0c;硬件定成本”。 1 | 为什么要有这么多格式&#xff1f; …...

PH热榜 | 2025-05-13

1. FirstQuadrant 标语&#xff1a;通过以人为本的人工智能来最大化B2B销售 介绍&#xff1a;销售人工智能&#xff0c;帮助创始人和收益团队提高效率&#xff0c;保持组织有序&#xff0c;并促成更多交易。它通过简化销售幕后工作&#xff0c;确保每个细节都不会遗漏。 产品…...

java基础-泛型

文章目录 目录 文章目录 前言 一、泛型的作用 1.类型安全 2.通用性 这里再举个例子 二、泛型的实现 1.泛型类 2.泛型接口 3.泛型方法 4.T符号的起源&#xff08;额外&#xff09; 三、泛型擦除 四、泛型通配符 1.上界通配符&#xff08; &#xff09; 为什么用于…...

对抗帕金森:在疾病阴影下,如何重掌生活主动权?

帕金森病&#xff0c;一种影响全球超 1000 万人的神经退行性疾病&#xff0c;正无声地改变着患者的生活轨迹。随着大脑中多巴胺分泌减少&#xff0c;患者逐渐出现肢体震颤、肌肉僵硬、步态迟缓等症状&#xff0c;甚至连扣纽扣、端水杯这类日常动作都变得艰难。更棘手的是&#…...

网络协议与系统架构分析实战:工具与方法全解

网络协议与系统架构分析实战&#xff1a;工具与方法全解 在互联网系统的开发、运维与安全分析中&#xff0c;协议解析与抓包分析是不可或缺的核心技能。本文将系统梳理主流协议解析工具、协议自动识别方案&#xff0c;并结合实际抓包案例&#xff0c;讲解如何还原和推测底层系…...

使用PocketFlow构建Web Search Agent

前言 本文介绍的是PocketFlow的cookbook中的pocketflow-agent部分。 回顾一下PocketFlow的核心架构&#xff1a; 每一个节点的架构&#xff1a; 具体介绍可以看上一篇文章&#xff1a; “Pocket Flow&#xff0c;一个仅用 100 行代码实现的 LLM 框架” 实现效果 这个Web S…...

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

一、简介: ADAU1701JSTZ-RL 是一款高性能音频编解码器 (Codec),专为便携式和低功耗应用设计。它集成了 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 ST…...

轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API

1. MNN 主要API 注意&#xff1a;本学习笔记只介绍了我在学习过程中常用的API &#xff0c;更多MNN API 请参考官方文档。 1.1. 推理时操作流程 创建Interpreter &#xff1a; createFromFile()通过Interpreter创建Session &#xff1a;createSession()设置输入数据: getSes…...

STM32 ADC 模数转换器详解:原理、配置与应用

STM32 ADC 模数转换器详解&#xff1a;原理、配置与应用 在嵌入式系统中&#xff0c;模数转换&#xff08;ADC&#xff09;是实现传感器信号采集、信号处理等任务的关键环节。STM32 微控制器作为一款功能强大的 32 位微控制器&#xff0c;其内置的 ADC 模块为开发者提供了高效…...

18.Excel数据透视表:第1部分创建数据透视表

一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…...

AI 模型训练轻量化技术在军事领域的实战应用与技术解析

AI 模型训练轻量化技术在军事领域的实战应用与技术解析 一、引言 在人工智能与军事领域深度融合的当下&#xff0c;AI 模型训练轻量化技术正成为破解战场资源限制的关键钥匙。通过模型压缩、量化、剪枝等核心技术&#xff0c;轻量化模型在算力受限、通信不稳定的复杂战场环境中…...

科学养生,开启健康生活

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。科学合理的养生方式&#xff0c;无需依赖传统医学理论&#xff0c;也能有效提升生活质量&#xff0c;为身体注入活力。​ 均衡饮食是养生的基础。每天应保证摄入足够的蛋白质、碳水化合物和脂肪&#xff0c;同时…...

高效跨平台文件传输与管理的工具

软件介绍 这款名为 Coolmuster Mobile Transfer 的工具是一款多平台支持的文件传输工具&#xff0c;能高效地在不同设备间进行文件传输与管理。 适用场景 它适用于多种场景&#xff0c;无论是个人文件整理、家庭成员间资料共享&#xff0c;还是企业场景下的工作文件处理&…...

如何优化 Linux 服务器的磁盘 I/O 性能

# 优化 Linux 服务器磁盘 I/O 性能的全面指南 ## 1. 识别 I/O 瓶颈 首先确定是否存在 I/O 瓶颈以及瓶颈位置&#xff1a; bash # 使用 iostat 查看磁盘 I/O 统计 iostat -x 1 # 使用 iotop 查看进程级 I/O 使用情况 iotop # 使用 vmstat 查看系统整体 I/O 情况 vmstat 1 …...

Python基础学习-Day23

目录 基础概念转换器&#xff08;transformer&#xff09;估计器&#xff08;estimator&#xff09;管道&#xff08;pipeline&#xff09; 实例pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”&#xff0c;也可以翻译为“流水线”&#xff0c;是机器学习中一个重…...

【Ubuntu】扩充磁盘大小

sudo apt-get install gparted 安装完成后&#xff0c;搜索gparted软件&#xff0c;打开gparted 参考...

数据治理域——日志数据采集设计

摘要 本文主要介绍了Web页面端日志采集的设计。首先阐述了页面浏览日志采集&#xff0c;包括客户端日志采集的实现方式、采集内容及技术亮点。接着介绍了无线客户端端日志采集&#xff0c;包括UserTrack的核心设计、移动端与浏览器端采集差异以及典型应用场景崩溃分析。最后探…...

Dinky 安装部署并配置提交 Flink Yarn 任务

官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 &#xff0c;但是官方文档最新稳定版为 1.1 &#xff0c;所以先选择 1.1.0&#xff0c;验证通过后&#xff0c;再尝试 1.2.3 &#xff0c;发现 1…...

杰理-701-手表sdk无法电脑连接经典蓝牙

杰理-701-手表sdk无法电脑连接经典蓝牙 只有手机可以连接经典蓝牙播放音乐&#xff0c;电脑无法连接&#xff0c;需要关闭emitter功能 交流q群&#xff1a;187115320...

Timsort 算法

文章目录 1 基础理解1.1 定义和原理1.2 工作原理 2 算法实现2.1 Python 代码实现2.1.1 代码2.1.2 核心逻辑计算最小运行长度&#xff08;calc_min_run(n)&#xff09;插入排序&#xff08;insertion_sort(arr, left, right)&#xff09; 2.2 Java 代码实现2.3 C 代码实现 3 逻辑…...

Go构建高并发权重抽奖系统:从设计到优化全流程指南

引言&#xff1a;为何需要专业抽奖系统&#xff1f; 在现代互联网应用中&#xff0c;抽奖系统被广泛用于营销活动、用户激励等场景。一个好的抽奖系统需要满足&#xff1a; 公平性&#xff1a;确保概率分布准确高性能&#xff1a;支持高并发抽奖请求安全性&#xff1a;防止作…...

深度学习计算

深度学习的飞速发展离不开强大的计算能力支撑。从张量计算到 GPU 加速&#xff0c;从自动微分到分布式计算&#xff0c;深度学习计算的每一项技术都如同精密仪器中的关键齿轮&#xff0c;推动着模型性能的不断提升。本文深入剖析深度学习计算的核心技术、优化策略以及前沿趋势&…...

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备&#xff08;BT-HD&#xff09;服务的初始化与启用流程&#xff0c;从接口初始化、服务掩码管理、服务请求路由到属性回调通知&#xff0c;完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理&#xff0c;揭示服务启用的核心机制&…...

Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别

在 Kotlin 中&#xff0c;Unit 类型和 Java 中的 void 关键字都用于表示“没有返回值”的函数&#xff0c;但它们在设计理念、类型系统和实际使用中有显著的区别。 1 Kotlin 中的 Unit 类型 表示无返回值&#xff1a; 当函数不返回有意义的值时&#xff0c;Kotlin 使用 Unit …...

Gemini 2.5 推动视频理解进入新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Spark Streaming 内部运行机制详解

核心思想&#xff1a;将实时数据流切割为“微批次”&#xff0c;利用 Spark Core 的批处理能力进行准实时计算。 1. 核心流程拆解 数据接收&#xff08;Input Data Stream&#xff09; 输入源&#xff1a;Kafka、Flume、Socket 等实时数据流。 接收器&#xff08;Receiver&…...

Feign+Resilience4j实现微服务熔断机制:原理与实战

引言&#xff1a;为什么需要熔断器&#xff1f; 在微服务架构中&#xff0c;服务间的依赖调用变得非常普遍。想象一下这样的场景&#xff1a;订单服务依赖支付服务&#xff0c;支付服务又依赖银行网关服务。如果银行网关服务出现故障&#xff0c;故障会向上蔓延&#xff0c;导…...