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

相关推荐
doubt。10 分钟前
8.攻防世界Web_php_wrong_nginx_config
网络·安全·web安全·网络安全
没有名字的小羊1 小时前
Cyber Security 101-Build Your Cyber Security Career-Security Principles(安全原则)
运维·网络·安全
m0_465215791 小时前
TCP & UDP Service Model
服务器·网络·tcp/ip
esmember1 小时前
电路研究9.2.6——合宙Air780EP中HTTP——HTTP GET 相关命令使用方法研究
网络·网络协议·http·at指令
xianwu5432 小时前
反向代理模块jmh
开发语言·网络·数据库·c++·mysql
行十万里人生3 小时前
Qt事件处理:理解处理器、过滤器与事件系统
开发语言·git·qt·华为od·华为·华为云·harmonyos
杨浦老苏3 小时前
面向npm的实时仪表板Dashly
网络·docker·群晖·导航
黑金IT4 小时前
Python3 + Qt5:实现AJAX异步更新UI
qt·ui·ajax
人工智能教学实践5 小时前
基于 yolov8_pyqt5 自适应界面设计的火灾检测系统 demo:毕业设计参考
qt·yolo·课程设计
扎量丙不要犟5 小时前
跨平台的客户端gui到底是选“原生”还是web
前端·javascript·c++·qt·rust·electron·tauri