欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > Qt第十三天:网络编程:TCP和UDP的使用

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

2024/10/24 12:09:41 来源:https://blog.csdn.net/CH3CH2CH4/article/details/142982451  浏览:    关键词: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 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com