#include "widget.h"
#include "ui_widget.h"
// 构造函数
Widget::Widget(QWidget *parent) :
QWidget(parent), // 基类构造函数调用
ui(new Ui::Widget), // 动态分配界面对象
tcpServer(new QTcpServer(this)) // 创建TCP服务器实例
{
// 设置UI界面
ui->setupUi(this);
setWindowTitle("服务器"); // 设置窗口标题
// 尝试启动TCP服务器监听端口
if (!tcpServer->listen(QHostAddress("127.0.0.1"), 8888))
{
// 如果监听失败,则输出错误信息
qDebug() << "服务器启动失败";
return; // 退出构造函数
}
else
{
// 如果监听成功,则输出成功信息
qDebug() << "服务器启动成功,监听端口: 8888";
}
// 当有新连接时,触发handleNewConnection槽函数
connect(tcpServer, &QTcpServer::newConnection, this, &Widget::handleNewConnection);
// 当用户点击发送按钮时,触发sendData槽函数
connect(ui->SendPushButton, &QPushButton::clicked, this, &Widget::sendData);
}
// 析构函数
Widget::~Widget()
{
// 清理资源
delete ui; // 释放UI对象内存
tcpServer->close(); // 关闭服务器
delete tcpServer; // 释放服务器对象内存
}
// 处理新连接
void Widget::handleNewConnection()
{
// 只要还有未处理的连接请求就一直处理
while (tcpServer->hasPendingConnections())
{
// 获取下一个待处理的连接
tcpSocket = tcpServer->nextPendingConnection();
// 当有数据可读时,更新接收文本区域
connect(tcpSocket, &QTcpSocket::readyRead, this, [=]() {
ui->RecvTextEdit->setText(tcpSocket->readAll()); // 显示接收到的数据
});
// 当连接断开时,自动删除QTcpSocket对象
connect(tcpSocket, &QTcpSocket::disconnected, tcpSocket, &QTcpSocket::deleteLater);
}
}
// 发送数据给客户端
void Widget::sendData()
{
// 检查是否处于连接状态
if (tcpSocket && tcpSocket->state() == QAbstractSocket::ConnectedState)
{
// 获取要发送的数据
QByteArray data = ui->SendTextEdit->toPlainText().toUtf8();
// 发送数据
tcpSocket->write(data);
tcpSocket->flush(); // 强制发送缓冲区中的数据
}
else
{
qDebug()<<"客户端未连接";
}
}
10-project-tcpServer
于 2024-04-23 19:34:12 首次发布