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

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

但是ta会点赞。

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

美丽大方很优雅。

说的就是你,

不用再怀疑哦

❤️TCP:

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

二、添加Qt设计师类

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

布局和命名

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

server.h文件:

cpp 复制代码
#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文件:

cpp 复制代码
#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文件

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文件

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文件

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文件:

cpp 复制代码
#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文件:

cpp 复制代码
#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文件:

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文件:

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文件:

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

相关推荐
kaixin_learn_qt_ing41 分钟前
了解RPC
网络·网络协议·rpc
安全小王子1 小时前
Kali操作系统简单介绍
网络·web安全
Hacker_LaoYi2 小时前
【漏洞分析】DDOS攻防分析(四)——TCP篇
网络·tcp/ip·ddos
爱吃水果蝙蝠汤3 小时前
DATACOM-IP单播路由(BGP)-复习-实验
网络·网络协议·tcp/ip
嵌入式大圣3 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云空3 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
Sun_12_23 小时前
SQL注入(SQL lnjection Base)21
网络·数据库
小老鼠不吃猫4 小时前
力学笃行(二)Qt 示例程序运行
开发语言·qt
网络安全Jack4 小时前
网络安全概论——身份认证
网络·数据库·web安全