Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐,

但是ta会点赞。

这样的人呢帅气低调有内涵,

美丽大方很优雅。

说的就是你,

不用再怀疑哦

❤️TCP:

一、创建项目,命名为Server,继承QWidget

二、添加Qt设计师类

三、设计client.ui和server.ui文件

布局和命名 

四、配置文件添加network模板,引入头文件

server.h文件:

#ifndef SERVER_H
#define SERVER_H#include <QWidget>
// QT += network加了这个不会报错
#include <QTcpServer>
#include <QTcpSocket>QT_BEGIN_NAMESPACE
namespace Ui {
class Server;
}
QT_END_NAMESPACEclass Server : public QWidget
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private:Ui::Server *ui;QTcpServer *MonitorSocket; // 监听的套接字QTcpSocket *CommuniactionSocket; //通信的套接字
};
#endif // SERVER_H

client.h文件:

#ifndef CLIENT_H
#define CLIENT_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>namespace Ui {
class CLient;
}class CLient : public QWidget
{Q_OBJECTpublic:explicit CLient(QWidget *parent = nullptr);~CLient();private:Ui::CLient *ui;QTcpSocket *ClientSocket; //套接字
};#endif // CLIENT_H

完整代码

server.cpp文件

#include "server.h" // 引入服务器头文件
#include "ui_server.h" // 引入用户界面服务器头文件Server::Server(QWidget *parent) // 构造函数,传入父窗口指针: QWidget(parent) // 初始化基类QWidget, ui(new Ui::Server) // 实例化用户界面对象
{ui->setupUi(this); // 设置用户界面// 设置ip和端口ui->SeverIP->setText("127.0.0.1"); // 设置服务器IP地址为本地回环地址ui->SeverPort->setText("8080"); // 设置服务器端口为8080// 实例化,初始化 监听的套接字MonitorSocket = new QTcpServer(this); // 创建一个新的TCP服务器对象// 监听 提取SeverIP(textEdit)的字符串,端口转intMonitorSocket->listen(QHostAddress(ui->SeverIP->text()), ui->SeverPort->text().toInt()); // 监听指定的IP地址和端口// 建立新的链接connect(MonitorSocket, &QTcpServer::newConnection, this, [=](){// 实例化,初始化 通信的套接字CommuniactionSocket = MonitorSocket->nextPendingConnection(); // 获取下一个待处理的连接ui->record->append("有新的链接"); // 在记录框中添加新链接提示// 保证CommuniactionSocket是一个有效的对象connect(CommuniactionSocket, &QTcpSocket::readyRead, this, [=](){// 接收数据QByteArray array = CommuniactionSocket->readAll(); // 读取所有可用的数据ui->record->append(array); // 将接收到的数据添加到记录框中});});// 发送按钮的实现connect(ui->send, &QPushButton::clicked, this, [=](){// 从输入框获取文本内容并发送CommuniactionSocket->write(ui->input->toPlainText().toUtf8().data()); // 将输入框中的文本转换为UTF-8编码并发送ui->record->append("Sever say:" + ui->input->toPlainText()); // 在记录框中添加发送的信息// 清除文本内容ui->input->clear(); // 清空输入框});
}Server::~Server() // 析构函数
{delete ui; // 删除用户界面对象
}

client.cpp文件

#include "client.h" // 引入客户端头文件
#include "ui_client.h" // 引入客户端界面头文件CLient::CLient(QWidget *parent) // 构造函数,传入父窗口指针: QWidget(parent) // 初始化基类QWidget, ui(new Ui::CLient) // 实例化UI对象
{ui->setupUi(this); // 设置UI界面// 设置服务器IP和端口ui->SeverIP->setText("127.0.0.1");ui->SeverPort->setText("8080");// 实例化并初始化监听套接字ClientSocket = new QTcpSocket(this);// 连接到服务器,提取IP地址和端口号ClientSocket->connectToHost(QHostAddress(ui->SeverIP->text()), ui->SeverPort->text().toInt());// 当有数据可读时,触发readyRead信号connect(ClientSocket, &QTcpSocket::readyRead, this, [=](){QByteArray array = ClientSocket->readAll(); // 读取所有数据到字节数组ui->record->append(array); // 将数据显示在记录框中});// 当发送按钮被点击时,触发clicked信号connect(ui->send, &QPushButton::clicked, this, [=](){// 从输入框获取文本并发送给服务器ClientSocket->write(ui->input->toPlainText().toUtf8().data());ui->record->append("Client say:" + ui->input->toPlainText()); // 在记录框中显示发送的消息// 清空输入框内容ui->input->clear();});
}CLient::~CLient() // 析构函数
{delete ui; // 删除UI对象
}

 main.cpp文件

#include "server.h"
#include <QApplication>
#include "client.h" //头文件int main(int argc, char *argv[])
{QApplication a(argc, argv);Server w;// 客户端显示,注意包含头文件CLient c;c.show();w.show();return a.exec();
}

运行结果

 

❤️UDP:

一、创建项目,命名为Server,继承QWidget

二、添加Qt设计师类

三、设计client.ui和server.ui文件

注意布局和命名 

四、配置文件添加network模板,引入头文件

server.h文件:

#ifndef SERVER_H
#define SERVER_H#include <QWidget>
#include <QUdpSocket>QT_BEGIN_NAMESPACE
namespace Ui {
class Server;
}
QT_END_NAMESPACEclass Server : public QWidget
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private:Ui::Server *ui;QUdpSocket *UdpSocket; //套接字
};
#endif // SERVER_H

client.h文件:

#ifndef CLIENT_H
#define CLIENT_H#include <QWidget>
#include <QUdpSocket>namespace Ui {
class Client;
}class Client : public QWidget
{Q_OBJECTpublic:explicit Client(QWidget *parent = nullptr);~Client();private:Ui::Client *ui;QUdpSocket *UdpSocket; //套接字
};#endif // CLIENT_H

完整代码

server.cpp文件:

#include "server.h" // 引入服务器头文件
#include "ui_server.h" // 引入用户界面服务器头文件
#include <QHostAddress> // 引入QHostAddress类,用于处理IP地址Server::Server(QWidget *parent): QWidget(parent) // 继承自QWidget类,设置父对象为parent, ui(new Ui::Server) // 创建一个新的Ui::Server对象
{ui->setupUi(this); // 初始化用户界面ui->ClientIP->setText("127.0.0.1"); // 设置客户端IP地址为本地回环地址ui->ClientPort->setText("8080"); // 设置客户端端口号为8080ui->SeverPort->setText("9999"); // 设置服务器端口号为9999// 初始化UDP套接字UdpSocket = new QUdpSocket(this);// 绑定服务器端口UdpSocket->bind(ui->SeverPort->text().toInt());// 当点击发送按钮时,发送数据connect(ui->send, &QPushButton::clicked, this, [=](){// 向指定的客户端IP和端口发送数据UdpSocket->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->ClientIP->text()), ui->ClientPort->text().toInt());ui->input->clear(); // 清空输入框});// 当有数据可读时,读取并显示数据connect(UdpSocket, &QUdpSocket::readyRead, this, [=](){qint64 size = UdpSocket->pendingDatagramSize(); // 获取待读取的数据大小QByteArray array(size, 0); // 创建一个字节数组用于存储数据UdpSocket->readDatagram(array.data(), size); // 读取数据到字节数组ui->record->append(array); // 将数据显示在记录框中});
}Server::~Server()
{delete ui; // 释放用户界面资源
}

client.cpp文件:

#include "client.h" // 引入客户端头文件
#include "ui_client.h" // 引入客户端界面头文件Client::Client(QWidget *parent): QWidget(parent) // 继承自QWidget类,设置父对象为传入的parent, ui(new Ui::Client) // 创建一个新的Ui::Client对象并初始化
{ui->setupUi(this); // 使用Ui::Client对象的setupUi方法设置界面ui->ServerIP->setText("127.0.0.1"); // 设置服务器IP地址为本地回环地址ui->ServerPort->setText("9999"); // 设置服务器端口号为9999ui->ClientPort->setText("8080"); // 设置客户端端口号为8080// 初始化UDP套接字UdpSocket = new QUdpSocket(this);// 绑定客户端端口UdpSocket->bind(ui->ClientPort->text().toInt());// 当点击发送按钮时,执行以下操作connect(ui->send, &QPushButton::clicked, this, [=](){// 向服务器发送数据,包括输入框中的文本内容、服务器IP地址和端口号UdpSocket->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->ServerIP->text()), ui->ServerPort->text().toInt());ui->input->clear(); // 清空输入框});// 当UDP套接字有数据可读时,执行以下操作connect(UdpSocket, &QUdpSocket::readyRead, this, [=](){qint64 size = UdpSocket->pendingDatagramSize(); // 获取待读取的数据大小QByteArray array(size, 0); // 创建一个字节数组用于存储数据UdpSocket->readDatagram(array.data(), size); // 读取数据到字节数组中ui->record->append(array); // 将接收到的数据追加到记录框中});
}Client::~Client()
{delete ui; // 析构函数,释放ui对象内存
}

main.cpp文件:

#include "server.h"
#include <QApplication>
#include "client.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);Server w;Client c;c.show();w.show();return a.exec();
}

运行结果

补充知识点:

tcp

udp 

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

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

相关文章

一套医药订单管理系统。该系统旨在通过数字化手段,实现医药订单的自动化处理、库存精准管理、供应链高效协同,以及数据驱动的决策支持。

1.产品介绍 产品名称: 智医链医药订单一体化管理系统 主要功能: 智能订单处理 自动化订单接收:系统支持多渠道订单接入(如电商平台、医院采购系统、线下门店等),自动抓取订单信息,减少人工录入错误。智能分配与调度:根据库存情况、配送距离、车辆载重等因素,智能分配…

ios在复制方面的兼容

在 iOS 开发中&#xff0c;特别是在使用 JavaScript 与 WebView 交互时&#xff0c;可能会遇到某些事件处理的限制。iOS 对于非用户动作&#xff08;non-user-initiated actions&#xff09;的事件处理有特定的安全策略&#xff0c;这是为了防止恶意代码或自动化脚本执行可能导…

如何进行数学家式的学习思考?

如何进行数学家式的学习思考&#xff1f; 学生阶段的数学学习是非常重要的&#xff0c;对这一点很少有人质疑。一提起数学学习&#xff0c;一些学生、家长甚至一些教师认为&#xff0c;学生的数学学习往往侧重于掌握基本概念、公式和解题技巧&#xff0c;通过做题来巩固知识和提…

【飞腾加固服务器】全国产化解决方案:飞腾FT2000+/64核,赋能关键任务保驾护航

在信息安全和自主可控的时代背景下&#xff0c;国产化设备的需求与日俱增&#xff0c;尤其是在国防、航空航天、能源和其他关键行业。高可靠性和极端环境设计的国产加固服务器&#xff0c;搭载强大的飞腾FT2000/64核处理器&#xff0c;全面满足国产自主可控的严苛要求。 性能强…

数字化那点事:一文读懂人工智能

人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为当今科技领域的热门话题&#xff0c;正以前所未有的速度改变着我们的生活。从智能家居到自动驾驶&#xff0c;从医疗诊断到金融分析&#xff0c;AI的应用无处不在。本文将通过通俗易懂的语言和丰富的案例&…

springboot 3.2.5集成spring security 只放行get请求,其他请求403

环境配置 jdk 17 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository --></…

Spring Boot 中的 @RequestMapping 和 Spring 中的 @RequestMapping 有什么区别?

在Spring框架中&#xff0c;RequestMapping注解用于映射Web请求到处理器&#xff08;控制器&#xff09;的方法上。在Spring Boot中&#xff0c;这个注解的使用方式并没有变化&#xff0c;但是Spring Boot作为Spring的扩展&#xff0c;提供了一些额外的便利性&#xff0c;使得开…

【Linux探索学习】第六弹——Linux的工具(一):Ubuntu系统下的软件包管理器

前言&#xff1a; 在Ubuntu系统中&#xff0c;Linux工具为用户提供了强大的命令行操作能力。这些工具不仅使日常任务的自动化成为可能&#xff0c;还大幅提升了生产力。本文将重点介绍一些常用的Linux工具&#xff1a;软件包管理器 注意&#xff1a;本文是所讲解的内容是在Ubun…

【C++基础篇】——逐步了解C++

【C基础篇】——逐步了解C 文章目录 【C基础篇】——逐步了解C前言一、C的第一个程序二、命名空间1.namespace的价值2.namespace的定义3.命名空间的使用 三、C的输入&输出四、缺省参数五、函数重载六、引用1.引用的概念和定义&#xff1a;2.引用的特性3.引用的使用4.const引…

Python进阶知识3

Python迭代器与生成器 迭代器 Iterator 1.什么是迭代器 迭代器是访问可迭代对象的工具迭代器是指用 iter(obj) 函数返回的对象(实例)迭代器可以用next(it)函数获取可迭代对象的数据 2.迭代器函数iter和next 函数说明iter(iterable)从可迭代对象中返回一个迭代器,iterable必…

使用LangGraph构建多Agent系统架构!

0 前言 Agent是一个使用大语言模型决定应用程序控制流的系统。随着这些系统的开发&#xff0c;它们随时间推移变得复杂&#xff0c;使管理和扩展更困难。如你可能会遇到&#xff1a; Agent拥有太多的工具可供使用&#xff0c;对接下来应该调用哪个工具做出糟糕决策上下文过于…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

ruoyi同时支持mysql+sqlserver+oracle+postgresql

需求背景 最近需要一个小demo,项目中需要同时连接sqlserver和mysql数据库。 操作教程 1、pom.xml -- 修改common/pom.xml<!-- 动态数据源 --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-star…

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

白平衡之 Gray Edge算法

免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。 读者在使用本文信息时,应…

Git 提交规范参考

Git 提交规范参考 feat 增加新的业务功能fix 修复业务问题/BUGperf 优化性能style 更改代码风格, 不影响运行结果refactor 重构代码revert 撤销更改test 测试相关, 不涉及业务代码的更改docs 文档和注释相关chore 更新依赖/修改脚手架配置等琐事workflow 工作流改进ci 持续集成…

PyTorch 介绍

什么是 PyTorch PyTorch 是一个开源的机器学习库&#xff0c;广泛用于计算机视觉和自然语言处理等应用。它由 Facebook 的人工智能研究团队开发&#xff0c;并得到了许多其他机构和个人的贡献。PyTorch 以其易用性、灵活性和动态计算图&#xff08;也称为自动微分系统&#xf…

Nexpose 6.6.273 发布,新增功能概览

Nexpose 6.6.273 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, released Oct 10, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 您的本地…

python学习-怎么在Pycharm写代码

打开Pycharm&#xff0c;点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 &#xff08;1&#xff09;点击**…** &#xff08;2&#xff09;选择python的安装路径 4.可修改文件名称-点击创建 …