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.rhkb.cn/news/452352.html

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

相关文章

CentOS7安装RabbitMQ-3.13.7、修改端口号

本文安装版本&#xff1a; Erlang&#xff1a;26.0 官网下载地址 Erlang RabbitMQ&#xff1a;3.13.7 官网下载地址 RabbitMQ RabbitMQ和Erlang对应关系查看&#xff1a;https://www.rabbitmq.com/which-erlang.html 注&#xff1a;安装erlang之前先安装下依赖文件&#xff0…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统&#xff0c;功能带有卡密生成和添加黑名单等&#xff0c;源码放在我的网盘里已经两年之久&#xff0c;由于玖逸现在已经跑路了所以现在发出来分享给大家&#xff0c;需要的可以自己拿去而开&#xff0c;反正功能也不是很多具体的自己…

Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案 LinkExpert 是一款软件应用程序&#xff0c;可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外&#xff0c;它还能轻松地将这些测试添加到自动回归测试流程中。 现在&#xff0c;…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统&#xff0c;是一个支持前后端分离设计的 客户端(C/S)项目&#xff0c;该示例项目前端xaml使用UI库 &#xff0c;Material Design Themes UI 来构建用户界面&#xff0c;确保…

C# -- Abstract、Virtual、interface

一、Virtual方法&#xff08;虚方法&#xff09; 1&#xff09;virtual 关键字用于在基类&#xff08;父类&#xff09;中修饰方法 2&#xff09;基类中定义了virtual方法&#xff0c;派生类中使用override重写该方法 二、Abstract方法&#xff08;抽象方法&#xff09; 1&…

【ssh】Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22

Mac 使用 ssh 连接阿里云报错&#xff1a;Connection reset by 8.155.1.xxx port 22 问题描述解决办法 问题描述 Connection reset by 8.155.1.xxx port 22解决办法 关掉代理 VPN

CTFHUB技能树之XSS——存储型

开启靶场&#xff0c;打开链接&#xff1a; 发现地址栏中的URL没有GET传参&#xff0c;而且这次是“Hello&#xff0c;no name” 还是跟反射型一样的流程&#xff1a; 先注入一下看看&#xff1a; <script>alert(1)</script> 但界面的结果还是“Hello&#xff0c…

【网络协议】之 HTTP 协议详解

HTTP 协议是 Web 的基石&#xff0c;它定义了客户端和服务器之间的通信规则。本文将深入地探讨 HTTP 的核心概念&#xff0c;包括工作原理、请求方法、状态码以及不同 HTTP 版本的演进。 一、HTTP 的工作原理 HTTP 协议基于客户端-服务器模型&#xff0c;遵循请求-响应的循环&…

FineReport 计算同比增长

1、数据库查询 SELECTt1.年,t1.月,t1.总金额 AS 同期金额,t1.仓库名称,t2.总金额 AS 上期金额 FROMtest t1LEFT JOIN test t2 ON ( t1.年 t2.年 1 ) AND t1.月 t2.月 AND t1.仓库名称 t2.仓库名称2、配置字段 月份字段加后缀 月 数据列加后缀 计算同比增长率 if(LEN(B3)0 …

2024年五一杯数学建模C题煤矿深部开采冲击地压危险预测求解全过程论文及程序

2024年五一杯数学建模 C题 煤矿深部开采冲击地压危险预测 原题再现&#xff1a; “煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动力灾害风险越来越大&#xff0c;严重影响着煤矿的安全高效开采。在…

VScode背景更改

效果 实现方法 第0步 以管理员身份运行VScode 首先 需要安装这个扩展 然后 接下来 找到配置文件 再后来 在配置文件的下面但不超过最后一个大括号的地方加入以下内容 "update.enableWindowsBackgroundUpdates": true,"background.fullscreen": {…

Nature 正刊丨群体爆发中的神经元序列在人类皮层中编码信息

01摘要 传统上&#xff0c;神经编码是通过对不同刺激的放电率和潜伏期的变化来检查的1,2,3,4,5。然而&#xff0c;神经元群体也可能表现出短暂的尖峰活动爆发&#xff0c;其中神经元以特定的时间顺序或序列放电6,7,8。人脑可以利用群体爆发中的这些神经元序列来有效地表示信息…

React中的useState和useEffect解析

一、组件状态管理——useState 1.定义 useState 是一个 React Hook&#xff08;函数&#xff09;&#xff0c;它允许我们向组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会跟着变化&…

力扣 中等 82.删除排序链表中的重复元素 II

文章目录 题目介绍题解 题目介绍 题解 只需在83题基础上加一个while循环即可 class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode dummy new ListNode(101, head);ListNode cur dummy;while (cur.next ! null && cur.next.next ! null) {…

汇编程序设计

文章目录 语句类型语句格式指令助记符操作数常量变量和符号运算符算数运算符逻辑运算符关系运算符分析运算符综合运算符优先级 伪指令数据定义伪指令符号定义伪指令标号定义伪指令&#xff1f;段定义伪指令段寻址伪指令过程定义伪指令程序计数器和定位伪指令&#xff1f;宏定义…

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望

诺贝尔物理学奖与机器学习、神经网络&#xff1a;一场跨时代的融合与展望 机器学习与神经网络的崛起 机器学习与神经网络的发展前景 机器学习和神经网络的研究与传统物理学的关系 总结 2024年&#xff0c;诺贝尔物理学奖颁给了机器学习与神经网络&#xff0c;这一具有里程碑…

一些关于FMEA在供应链风险管理中的实际应用案例_SunFMEA

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 FMEA&#xff08;失效模式与影响分析&#xff09;在供应链风险管理中的实际应用案例&#xff1a; 案例一&#xff1a;某电子制造企业 该企业在生产一款新型智能手…

4 -《本地部署开源大模型》在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型

在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型 大模型部署整体来看并不复杂&#xff0c;且官方一般都会提供标准的模型部署流程&#xff0c;但很多人在部署过程中会遇到各种各样的问题&#xff0c;很难成功部署&#xff0c;主要是因为这个过程会涉及非常多依赖库的安装和更新及…

Spark安装

Downloads | Apache Spark 拖动安装包 上传虚拟机 # 解压锁环境就安装好能使用 tar -zxvf spark-3.3.1-bin-hadoop3.tgz# 修改文件名称 mv spark-3.3.1-bin-hadoop3 spark-local 1.Local模式 测试案例&#xff1a;计算圆周率π # Usage: spark-submit [options] <app ja…

AtCoder Beginner Contest 375 F - Road Blocked

AtCoder Beginner Contest 375 F - Road Blocked 题目大意 给你一个n个点m条边的无向图&#xff0c;接下来有两种操作 1.删除编号为 i i i 的边 2.询问 x , y x,y x,y 两点之间的最短路 思路 注意到 n < 300 n<300 n<300 &#xff0c;而且我我们需要任意两点最…