我发现了有些人喜欢静静看博客不聊天呐,
但是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