C++ QTcpSocket 服务器通信示例代码

#include <QWidget>
#include <QTcpSocket>
#include <QDataStream>
#include <QPixmap>
#include <QPalette>
#include <QPushButton>
#include <QString>
#include <QDebug>

#include 'procession.h'
#include 'ui_procession.h'

Procession::Procession(int userid, QWidget *parent) : 
    QWidget(parent),
    ui(new Ui::Procession),
    userid(userid)
{
    ui->setupUi(this);
    processionWidget();
    m_socket = new QTcpSocket(this);
    connect(ui->connectBtn, &QPushButton::clicked, this, &Procession::on_pushButton_clicked);
    connect(m_socket, &QTcpSocket::readyRead, this, &Procession::readyRead);
    connect(m_socket, &QTcpSocket::connected, this, &Procession::connected);
    connect(m_socket, &QTcpSocket::disconnected, this, &Procession::disconnected);
}

Procession::~Procession()
{
    delete ui;
}

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::on_pushButton_clicked()
{
    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())); // 避免隐式转换导致的警告
}

void Procession::connected()
{
    ui->message->append('连接成功');
    // 发送userid给服务器
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out << this->userid;
    m_socket->write(block);
}

void Procession::disconnected()
{
    ui->message->append('连接失败');
    m_socket->close();
}

void Procession::readyRead()
{
    QByteArray data = m_socket->readAll();
    QString suggestion = QString::fromUtf8(data);
    ui->message->append(suggestion);
    // m_socket->close(); // 考虑是否需要在此处关闭连接,取决于通信协议
}

代码优化建议:

  1. 发送userid: 在 connected() 函数中,需要使用 m_socket->write(block); 发送数据到服务器。
  2. 关闭连接: 在 disconnected() 函数中,已正确关闭了socket连接。
  3. 数据解析: 在 readyRead() 函数中,需要根据具体的通信协议解析服务器返回的数据,目前只是将数据转换为QString并显示在界面上。
  4. 错误处理: 可以考虑添加错误处理机制,例如处理连接超时、连接错误等情况。
  5. 界面美化: 可以对界面进行美化,增加一些交互功能,例如显示连接状态、发送消息等。

总体来说,代码的基本框架是合理的,但还需要进一步完善和优化。


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

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