#ifndef PROCESSION_H #define PROCESSION_H

#include #include #include #include #include

namespace Ui { class Procession; }

class Procession : public QWidget { Q_OBJECT

public: explicit Procession(int userid,QWidget *parent = nullptr); ~Procession(); void processionWidget();

private slots: void connected(); void readyRead(); void displayError(QAbstractSocket::SocketError error); void on_connectBtn_clicked();

private: Ui::Procession ui; int userid; QTcpSocket m_socket; };

#endif // PROCESSION_H #include "procession.h" #include "ui_procession.h" #include #include

Procession::Procession(int userid,QWidget *parent) : QWidget(parent), ui(new Ui::Procession), userid(userid) { ui->setupUi(this); processionWidget(); m_socket = new QTcpSocket(this);

connect(m_socket, &QTcpSocket::readyRead, this, &Procession::readyRead);
connect(m_socket, &QTcpSocket::connected, this, &Procession::connected);

connect(m_socket, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error), this, &Procession::displayError);

}

Procession::~Procession() { delete ui; // 在程序结束前关闭套接字 m_socket->close(); }

void Procession::processionWidget() { setWindowTitle("服务器通信"); setAutoFillBackground(true); QPalette palette=this->palette(); QPixmap pixmap(":/user/image/image/net.jpg"); palette.setBrush(QPalette::Window, QBrush(pixmap)); setPalette(palette); setFixedSize(600,400); }

void Procession::connected() { ui->message->append("连接成功"); QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out << static_cast(this->userid); qDebug()<<static_cast(this->userid); if (m_socket->write(block) == -1) { ui->message->append("发送userid失败"); m_socket->close(); } }

void Procession::readyRead() { QByteArray data = m_socket->readAll(); if (data.isEmpty()) { ui->message->append("读取的数据为空"); return; } /// 解析服务器返回的数据 QString suggestion = QString::fromUtf8(data); ui->message->append(suggestion); }

void Procession::displayError(QAbstractSocket::SocketError error) { QString errorMessage; switch (error) { case QAbstractSocket::ConnectionRefusedError: errorMessage = "连接被拒绝"; break; case QAbstractSocket::HostNotFoundError: errorMessage = "未找到主机"; break; case QAbstractSocket::SocketTimeoutError: errorMessage = "连接超时"; break; case QAbstractSocket::NetworkError: errorMessage = "网络错误"; break; default: errorMessage = "未知错误"; break; } ui->message->append(errorMessage); }

void Procession::on_connectBtn_clicked() { if (m_socket->state() == QAbstractSocket::ConnectedState) { m_socket->disconnectFromHost(); // 先关闭套接字 }

QString ip = ui->IP->text();
QString port = ui->port->text();

if (ip.isEmpty() || port.isEmpty()) {
    ui->message->clear();
    ui->message->append("请输入有效的IP地址和端口号");
    return;
}

ui->message->clear();
ui->message->append("正在连接中...");
m_socket->connectToHost(ip, static_cast<quint16>(ui->port->text().toInt()));

}

// 函数接口说明 // 函数名:Procession // 文件名:procession.h // 功能概要:构造函数,创建Procession对象 // 参数 // 类型:int, QWidget* // 变量名:userid, parent // I/O:输入 // 说明:构造函数用于创建Procession对象,并初始化成员变量userid和parent // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:构造函数会调用processionWidget()函数对界面进行初始化,并创建QTcpSocket对象m_socket。还会连接相应的信号和槽函数。 // 函数名:~Procession // 文件名:procession.h // 功能概要:析构函数,销毁Procession对象 // 参数类型:无 // 变量名:无 // I/O:无 // 说明:析构函数用于销毁Procession对象,并关闭套接字m_socket // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:无 // 函数名:processionWidget // 文件名:procession.h // 功能概要:初始化界面 // 参数类型:无 // 变量名:无 // I/O:无 // 说明:processionWidget函数用于设置窗口标题、背景图片、窗口大小 // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:无 // 函数名:connected // 文件名:procession.h // 功能概要:连接成功后的处理函数 // 参数类型:无 // 变量名:无 // I/O:无 // 说明:connected函数会在连接成功后被调用,向服务器发送userid,并显示连接成功的提示信息 // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:无 // 函数名:readyRead // 文件名:procession.h // 功能概要:接收数据的处理函数 // 参数类型:无 // 变量名:无 // I/O:无 // 说明:readyRead函数会在接收到服务器返回的数据后被调用,解析数据并显示在界面上 // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:无 // 函数名:displayError // 文件名:procession.h // 功能概要:显示错误信息的处理函数 // 参数类型:QAbstractSocket::SocketError // 变量名:error // I/O:无 // 说明:displayError函数会在连接错误时被调用,根据错误类型显示相应的错误信息 // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:无 // 函数名:on_connectBtn_clicked // 文件名:procession.h // 功能概要:连接按钮的点击事件处理函数 // 参数类型:无 // 变量名:无 // I/O:无 // 说明:on_connectBtn_clicked函数会在连接按钮被点击时被调用,连接到指定的IP地址和端口号 // 返回值:无 // 值类型:无 // 说明:无 // 详细说明:无 // 使用注意事项:在使用Procession类时,需要先创建对象并传入userid参数,然后调用show()函数显示窗口。在窗口关闭前需要调用delete释放对象。

Qt 客户端:服务器通信工具

原文地址: https://www.cveoy.top/t/topic/qmrR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录