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.pswp.cn/bicheng/71615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71615.shtml
英文地址,請注明出處:http://en.pswp.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;為我們提供了…