当前位置: 首页 > article >正文

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 


http://www.kler.cn/news/357752.html

相关文章:

  • 高效图书管理:基于Spring Boot的进销存系统
  • 洛谷 AT_abc373_d [ABC373D] Hidden Weights 题解
  • 019_基于python+django食品销售数据分析系统2024_4032ydxt
  • cpp详解:string
  • 基于单片机的 16 键多功能电子琴硬件设计
  • 人工智能公司未达到欧盟人工智能法案标准
  • Sentinel 快速入门
  • 网络安全有关法律法规
  • SpringBoot民宿预订系统设计与实现
  • LeetCode714:买卖股票的最佳时机含手续费
  • 深度学习基础知识-02 数据预处理
  • 生成式对抗网络 (GAN) |简介
  • 1.2.3 TCP IP模型
  • uniapp中使用lottie实现JSON动画
  • 大数问题python解决合集(个人总结)
  • OpenAI若造出AGI,就能从微软独立:股权争夺战开打,两边都找好了投行
  • 第13篇:无线与移动网络安全
  • h2数据库模拟mysql进行单元测试遇到的问题
  • 运维软件:监控易如何助力运维团队跨越数据整合与分析的鸿沟
  • 科研绘图系列:R语言突出强调部分的饼图(pie plot)