Udp发送和接收数据(python和QT)

服务端代码 (python)

import socketdef udp_server(host='0.0.0.0', port=12345):# 创建一个UDP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动,监听端口 {port}...")try:while True:# 接收来自客户端的数据包data, addr = sock.recvfrom(1024)  # 1024是缓冲区大小# 打印接收到的数据和客户端地址print(f"接收到来自 {addr} 的数据: {data.decode()}")# 构造响应数据response = f"服务器已接收到来自 {addr} 的数据: {data.decode()}"# 向客户端发送响应数据包sock.sendto(response.encode(), addr)# 打印发送响应的确认print(f"已向 {addr} 发送响应数据")except KeyboardInterrupt:print("服务器接收到中断信号,正在关闭...")finally:# 关闭套接字sock.close()print("服务器已关闭")# 运行UDP服务器
udp_server()

在这个示例中,服务器使用recvfrom方法接收数据包,该方法会阻塞直到接收到一个数据包。数据包包含两部分:数据本身客户端的地址(IP地址和端口号)。

注意,虽然这个服务器代码看起来是顺序执行的,但实际上UDP套接字能够同时接收多个数据包。当多个数据包同时到达时,它们会被放入操作系统的网络缓冲区中,recvfrom方法会依次处理这些数据包。因此,服务器能够“同时”处理多个客户端的请求,尽管在代码层面上它是顺序处理的。

对于UDP来说,由于每个数据包都是独立的,并且没有建立持久的连接,所以通常不需要像TCP那样为每个客户端创建单独的线程或进程。



客户端

如果程序在发送数据之前没有绑定端口,那么每次发送数据时,系统可能会分配一个新的端口号‌。这是因为UDP协议本身不要求在通信双方之间建立连接,因此每次发送数据时都可以使用不同的端口号。在接收端收到数据之后,系统又会自动释放掉这个端口号‌1。

但是,‌如果程序在发送数据之前绑定了特定的端口,那么只要程序不退出,它就会一直使用这个绑定的端口来发送消息‌。即使多次发送数据,端口号也不会改变,除非程序重新启动或显式地解绑并重新绑定到另一个端口‌。



UDP通信通常不区分严格的客户端和服务器角色,因为UDP是无连接的协议。不过,为了说明问题,我们可以将两个实体分别称为“发送者”(可以视作客户端)和“接收者”(可以视作服务器),尽管它们在UDP中实际上是对等的。



以下是 QT代码的实现


 客户端(qt)

#include <QCoreApplication>
#include <QUdpSocket>
#include <QByteArray>
#include <QHostAddress>
#include <QTimer>
#include <QDebug>class UdpClient : public QObject {Q_OBJECTpublic:UdpClient(QObject *parent = nullptr): QObject(parent), udpSocket(new QUdpSocket(this)) {// 定时器用于定期发送数据QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &UdpClient::sendDatagram);timer->start(1000); // 每秒发送一次// 连接接收信号到槽函数connect(udpSocket, &QUdpSocket::readyRead, this, &UdpClient::readPendingDatagrams);}private slots:void sendDatagram() {QByteArray datagram = "Hello from Client!";udpSocket->writeDatagram(datagram, QHostAddress::LocalHost, 12345);qDebug() << "Sent datagram:" << datagram;}void readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received datagram from" << sender.toString() << ":" << senderPort;qDebug() << datagram;}}private:QUdpSocket *udpSocket;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);UdpClient client;return a.exec();
}#include "main.moc"

服务端(qt) 

#include <QCoreApplication>
#include <QUdpSocket>
#include <QByteArray>
#include <QDebug>class UdpServer : public QObject {Q_OBJECTpublic:UdpServer(QObject *parent = nullptr): QObject(parent), udpSocket(new QUdpSocket(this)) {// 绑定接收端口udpSocket->bind(12345);// 连接接收信号到槽函数connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);}private slots:void readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received datagram from" << sender.toString() << ":" << senderPort;qDebug() << datagram;// 发送响应给客户端QByteArray response = "Hello from Server!";udpSocket->writeDatagram(response, sender, senderPort);qDebug() << "Sent response:" << response;}}private:QUdpSocket *udpSocket;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);UdpServer server;return a.exec();
}#include "main.moc"

FR:徐海涛(hunkxu)

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

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

相关文章

VBA脚本将DeepSeek嵌入Word中教程

一、获取API-Key 目前我们可以直接只用官网的API来实现&#xff0c;申请这一步是关键 也可以直接访问官网的API平台&#xff1a;https://platform.deepseek.com/ &#xff0c;没注册的注册完登录一下&#xff0c;我们点击到左侧菜单的“APIKeys”按钮&#xff0c;然后点击右侧…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

网站搭建基本流程

需求分析&#xff1a; 实现网站搭建的过程&#xff1a;首先进行网站的需求性分析 网站可分为前台系统和后台系统&#xff0c;由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块&#xff1a; 在编写代码前&#xff0c;我们要先对网站进行架构&#xff0c;通过…

解决elementUi el-select 响应式不生效的问题

情况一,字段类型不匹配 考虑option的value值的字段类型是否和api返回的字段类型一致&#xff0c;如果一个为字符串一个为数字类型是无法匹配上的 <template> <div><el-select v-model"value" size"large"style"width: 240px"&…

QT实战-基于QWidget实现的异形tip窗口

本文主要介绍了qt中,基于QWidget实现异形tip窗口的几种实现方式,话不多说,先上图, 1.使用QPainter和QPainterPath实现 代码:tipwnd1.h #ifndef TIPWND1_H #define TIPWND1_H#include <QWidget>class TipWnd1 : public QWidget {Q_OBJECTQ_PROPERTY(QColor my_border…

【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道

文章目录 从结构到操作&#xff1a;手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义&#xff1a; 三、插入操作3.1 插入操作概述3.2 步骤1&#xff1a;按二叉查找树规则插入节点3.3 步骤2…

么是静态住宅IP,跨境电商为什么需要静态住宅IP

静态住宅IP是指直接分配给一台属于私人住宅网络的设备的固定IP地址&#xff0c;这种地址不会频繁更改。它们作为代理IP&#xff0c;使使用者能够通过这些代理服务器进行网络访问&#xff0c;而对外显示的则是该住宅的IP地址。由于这些IP地址属于真实的住宅或个人&#xff0c;并…

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a

leetcode刷题记录(一百零七)——279. 完全平方数

&#xff08;一&#xff09;问题描述 279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09;279. 完全平方数 - 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#x…

软考高级信息系统项目管理师笔记-第2章信息技术发展

第2章 信息技术发展 2.1 信息技术及其发展 1、按表现形态的不同,信息技术可分为硬技术(物化技术)与软技术(非物化技术)。前者指各种信息设备及其功 能,如传感器、服务器、智能手机、通信卫星、笔记本电脑。后者指有关信息获取与处理的各种知识、方法 与技能,如语言文字…

搭建RAG知识库的完整源码实现

搭建RAG知识库的完整源码实现&#xff08;基于Python 3.8&#xff09;&#xff1a; # -*- coding: utf-8 -*- # 文件名&#xff1a;rag_knowledge_base.py # RAG知识库搭建完整源码&#xff08;含中文注释&#xff09;import os import re import shutil import chromadb from…

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中&#xff0c;可能会综合考虑成本、可拓展、通信交互等&#xff0c;用AFE&#xff08;模拟前端&#xff09;MCU&#xff08;微控制器&#xff09;实现BMS&#xff08;电池管理系统&#xff09;。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…

基于SpringBoot的智慧家政服务平台系统设计与实现的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

什么是 Cloud Studio DeepSeek ; 怎么实现Open WebUI快速体验

什么是 Cloud Studio DeepSeek ;怎么实现Open WebUI快速体验 一、概述 欢迎使用 Cloud Studio DeepSeek 工作空间!我们已为您预装并启动了以下服务,等待加载十几秒即可查看效果: Ollama 服务:支持通过 API 调用 DeepSeek 模型。 AnythingLLM 前端服务:提供交互式聊天界…

【Python 语法】常用 Python 内置函数

reversed() 反转reversed() 的语法反转字符串、列表、元组 sorted() 自定义排序sorted() 语法使用示例1. 基本排序&#xff1a;默认升序排列2. 基本排序&#xff1a;降序排列3. 自定义排序&#xff1a;使用 key 参数4. 自定义排序&#xff1a;按某种规则进行排序5. 排序字典&am…

[网络] 如何开机自动配置静态IP,并自动启动程序

背景&#xff1a; 需要固定ip地址&#xff0c;并且能够自动启动可执行文件。 流程&#xff1a; 1.在/etc/network/interfaces 中添加 auto eth0 iface eth0 inet staticaddress 192.168.1.100netmask 255.255.255.0gateway 192.168.1.1 2.将下面这行代码添加自动启动脚本 …

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果图&#xff1a; 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…

【C# 数据结构】队列 FIFO

目录 队列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理&#xff1a;示例&#xff1a;解释&#xff1a; 小结&#xff1a; 环形队列1. **FIFO&#xff1f;**2. **环形缓冲队列如何实现FIFO&#xff1f;**关键概念&#xff1a; 3. **环形缓冲队列的工作过程**假设…

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】&#xff0c;点击【个人】 3.【command shift J】显示所有文件&#xff0c;打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹&#xff1a;用于存储每个应用程序的沙盒数据&#xff0c;确保应用程序…

Hutool - DFA:基于 DFA 模型的多关键字查找

一、简介 在文本处理中&#xff0c;常常需要在一段文本里查找多个关键字是否存在&#xff0c;例如敏感词过滤、关键词匹配等场景。Hutool - DFA 模块基于确定性有限自动机&#xff08;Deterministic Finite Automaton&#xff0c;DFA&#xff09;模型&#xff0c;为我们提供了…