C++ QTcpSocket 服务器通信示例代码
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(); // 考虑是否需要在此处关闭连接,取决于通信协议
}
代码优化建议:
- 发送userid: 在
connected()函数中,需要使用m_socket->write(block);发送数据到服务器。 - 关闭连接: 在
disconnected()函数中,已正确关闭了socket连接。 - 数据解析: 在
readyRead()函数中,需要根据具体的通信协议解析服务器返回的数据,目前只是将数据转换为QString并显示在界面上。 - 错误处理: 可以考虑添加错误处理机制,例如处理连接超时、连接错误等情况。
- 界面美化: 可以对界面进行美化,增加一些交互功能,例如显示连接状态、发送消息等。
总体来说,代码的基本框架是合理的,但还需要进一步完善和优化。
原文地址: http://www.cveoy.top/t/topic/fCba 著作权归作者所有。请勿转载和采集!