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_NAMESPACE

class Server : public QWidget
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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)的字符串,端口转int
    MonitorSocket->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_NAMESPACE

class Server : public QWidget
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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"); // 设置客户端端口号为8080
    ui->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"); // 设置服务器端口号为9999
    ui->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 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)

前言 &#x1f31f;&#x1f31f;本期讲解关于CAS的补充和JUC中有用的类&#xff0c;这里涉及到高频面试题哦~~~ &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&…

Server-Sent Event(SSE) GPT场景实现

关于SSE的基本概念可以看一下阮一峰老师的这篇文章&#xff1a;Server-Sent Events教程。 现在比较常见的场景是gpt回答的时候类似下图这种打字机的情况&#xff0c;因为AI一般响应时间会比较长&#xff0c;使用这种方式能让人别等那么久&#xff0c;是一个相对比较良好的用户…

JVM篇(学习预热 - JVM正式展开 - (实战课程学习总结))(持续更新迭代)

目录 除了了解JVM的一些基本常识&#xff0c;我们并没有提到JVM的架构&#xff0c;就像我们做项目之前的预热&#xff0c;还是有必要先了解好它的架构&#xff0c;让我们开始吧&#xff01; 一、JVM程序执行流程 1. 执行流程图 2. 热点代码 3. 热点检测方式 方法一&#x…

离散数学实验二c语言(输出关系矩阵,输出矩阵性质,输出自反闭包,对称闭包,传递闭包,判断矩阵是否为等价关系,相容关系,偏序关系)

离散数学实验二 一、算法描述&#xff0c;算法思想 &#xff08;一&#xff09;相关数据结构 typedef struct Set *S; //存放集合 struct Set {int size; //集合的元素个数char *A; //存放该集合的元素 }; Set存放有限集合A&#xff0c;该集合的元素个数为size&#xff0…

数据分析方法(回归分析,决策树与神经网络,提升树,时间序列分析,假设检验,用户画像,竞品分析)等

1.回归分析 回归分析是一种统计方法&#xff0c;用于探索自变量&#xff08;预测变量&#xff09;和因变量&#xff08;目标变量&#xff09;之间的关系。它可以帮助预测变量的变化对目标变量的影响大小。例如&#xff0c;简单线性回归用于分析两个变量之间的线性关系&#xf…

能源领域下暖通行业现状-研究

基于AI大语言模型的暖通行业能源管理系统构建研究 一、能源管理中的突出问题 1. **能源消耗监测不准确** 现有的监测系统在获取设备实时能耗数据方面存在精度不足的问题&#xff0c;难以准确反映能源的实际使用情况。这使得节能决策缺乏可靠的数据支持&#xff0c;无法精准定位…

react18中的计算属性及useMemo的性能优化技巧

react18里面的计算属性和使用useMemo来提升组件性能的方法 计算属性 实现效果 代码实现 函数式组件极简洁的实现&#xff0c;就这样 import { useState } from "react"; function FullName() {const [firstName, setFirstName] useState("");const [la…

『 Linux 』HTTP(三)

文章目录 HTTP的请求方法HTTP的状态码模拟404状态重定向状态码状态码与浏览器的联系 TCP的短连接与长连接Connection 头部Content-Type 头部Set-Cookie 头部Session ID 本文代码参照前一篇博客 HTTP的请求方法 HTTP协议存在多种请求方法,但是较为常用的请求方法基本为GET方法与…

开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序:企业产供销全流程的创新驱动

摘要&#xff1a;本文探讨了开源 AI 智能名片、链动 21 模式以及 S2B2C 商城小程序源码在企业产供销过程中的作用。通过分析社交电商与企业产供销的关联、数据运营体系的支撑作用以及小程序功能在企业产供销中的应用等方面&#xff0c;阐述了其在产品研发、传播、营销和公关方面…

2013 lost connection to MySQL server during query

1.问题 使用navicat连接doris&#xff0c;会有这个错误。 2.解决 换低版本的navicat比如navicat11。

Leetcode—192. 统计词频【中等】(Shell)

2024每日刷题&#xff08;188&#xff09; Leetcode—192. 统计词频 实现代码 # Read from the file words.txt and output the word frequency list to stdout. cat words.txt | tr -s \n | sort | uniq -c | sort -nr | awk {print $2, $1}运行结果 之后我会持续更新&…

spring 启动失败 active: @env@

参考&#xff1a;SpringBoot启动失败报错&#xff0c;spring.profiles.active:env中环境变量无法识别报错_active: env_profileactive启动报错 ine 3, column 13:-CSDN博客

开源vGPU方案 HAMi实现细粒度GPU切分——筑梦之路

前言 为什么需要 GPU 共享、切分等方案&#xff1f; 在使用GPU的过程中我们会发现&#xff0c;直接在裸机环境使用&#xff0c;都可以多个进程共享 GPU&#xff0c;怎么到 k8s 环境就不行了&#xff1f; 1. 资源感知 在 k8s 中资源是和节点绑定的&#xff0c;对于 GPU 资源…

【MySQL】 表的增删操作

目录 1.Create&#xff08;增&#xff09; 1.1.单行数据 全列插入 1.2.多行数据 指定列插入 1.3.插入否则更新 1.4.替换数据&#xff08;REPLACE&#xff09; 2.Delete&#xff08;删&#xff09; 2.1.删除表中的某个条目 2.2.删除整张表数据 2.3.截断表 1.Create…

智汇云舟亮相WAFI世界农业科技创新大会,并参编数字农业产业图谱

10月10日&#xff0c;2024WAFI世界农业科技创新大会农食行业创新与投资峰会在北京金海湖国际会展中心举行。中国农业大学MBA教育中心主任、教授付文阁、平谷区委常委、统战部部长刘堃、华为公共事业军团数字政府首席专家刘丹、荷兰瓦赫宁根大学前校长Aalt Dijkhuizen、牧原食品…

【论文阅读】Bi-Mamba+: Bidirectional Mamba for Time Series Forecasting

文章目录 概要阅读背景知识引言创新之处 研究方法概述方法部分的核心模块多尺度打补丁&#xff08;Multi-Scale Patching&#xff09;Mamba&#xff1a;全局模式专家Local Window Transformer&#xff08;LWT&#xff09;&#xff1a;局部变化专家长短期路由器&#xff08;Long…

pikachu靶场SQL-Inject中的“delete“注入、“http header“注入、盲注、宽字节注入

"delete"注入 抓包发现在留言时有messagehhhh&submitsubmit两个参数&#xff0c;但并未涉及到数据库操作。除此之外&#xff0c;在删除留言时URL中拼接了?id的参数 构造?id59有报错回显 利用报错注入函数来查询数据&#xff0c;有空格编译不通过&#xff0c…

Agent智能体?我们要的到底是什么

What is an agent? ❝ 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;的能力越来越强&#xff0c;应用范围也越来越广泛&#xff0c;其中一个热门方向就是智能体&#xff08;Agent&#xff09;。但在这一切的背后&#xff0c;我们真正追求的是什么&#xff1f;是…

SSM框架学习(七、MyBatis-Plus高级用法:最优化持久层开发)

目录 一、MyBatis-Plus快速入门 1.简介 2.快速入门 二、MyBatis-Plus核心功能 1.基于Mapper接口CRUD &#xff08;1&#xff09;Insert 方法 &#xff08;2&#xff09;Delete方法 &#xff08;3&#xff09;Update 方法 &#xff08;4&#xff09;Select方法 2.基于Serv…

解决在Windows中安装tensorflow2.10无法检测到GPU的问题

解决在Windows中安装tensorflow2.10无法检测到GPU的问题 官方给出的Windows本地安装方式 更新显卡驱动到最新。安装anaconda或miniconda作为python环境的管理工具。创建新的环境tf&#xff1a;conda create --name tf python3.9&#xff0c;然后进入改环境&#xff1a;conda …