Qt中客户端的创建
qt中客户端的创建:
- 在qt的项目文件中添加如下代码,导入网络模块:
QT += network- 添加头文件:
#include <QTcpSocket>- 创建客户端对象:
QTcpSocket *socket = new QTcpSocket(this);这里的QTcpSocket *socket表示客户端的socket对象。可以直接在类的成员函数中定义。然后在类的构造函数中初始化:
socket = new QTcpSocket(this);- 连接信号和槽(在构造函数中):
connect(socket, &QTcpSocket::connected, this, &MyClient::connected);connect(socket, &QTcpSocket::readyRead, this, &MyClient::readyRead);connect(socket, &QTcpSocket::disconnected, this, &MyClient::disconnected);这里的MyClient表示客户端的类名。connected、readyRead、disconnected分别表示连接成功、有数据可读、连接断开这三种情况,这三个信号分别对应三个自定义槽函数:connected()、readyRead()、disconnected(),可在对应的槽函数中处理对应的逻辑。
- 连接到服务器:
socket->connectToHost(QHostAddress::LocalHost, 8888);这里的QHostAddress::LocalHost表示连接到本地主机,8888表示连接到本地主机的8888端口。
连接服务器可放到一个按钮的点击事件的槽函数中,然后ip和端口号可设置为动态参数,比如界面上的两个LineEdit控件:
void MyClient::connectToServer(){ socket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUShort());}- 发送数据:
void MyClient::sendData(){ socket->write(ui->textEdit->toPlainText().toUtf8());}这里的ui->textEdit->toPlainText().toUtf8()表示要发送的字符串,此处发送的内容为textEdit控件中的文本内容,socket->write()表示将字符串发送到服务器。
发送数据可放到一个按钮的点击事件的槽函数中,比如界面上的一个PushButton控件,上面的槽函数就是按钮的点击信号的槽函数:
connect(ui->sendBtn, &QPushButton::clicked, this, &MyClient::sendData);- 接收数据:
void MyClient::readyRead(){ QByteArray data = socket->readAll(); ui->lineEdit->setText(QString::fromUtf8(data));}这里的ui->lineEdit->setText(QString::fromUtf8(data))表示将服务器返回的数据显示在lineEdit控件中,如果是回显到TextEdit控件,则使用ui->textEdit->setPlainText(QString::fromUtf8(data))。这里的setPlainText()是替换TextEdit控件中的文本内容,会清空TextEdit控件中的原有内容。如果要在光标处添加文本内容,则使用ui->textEdit->insertPlainText(QString::fromUtf8(data))。
- 断开重连机制,使用定时器:
void MyClient::disconnected(){ QTimer::singleShot(1000, this, &MyClient::connectToServer);}这里的QTimer::singleShot(1000, this, &MyClient::connectToServer)表示1秒后调用connectToServer()函数,实现断开重连机制。注意这里只适用连接成功的情况下断开才会重连,如果是连接失败,则不会重连。如果要实现没有连接成功也会重连的机制则需要再关联一个信号:
connect(socket, &QTcpSocket::errorOccurred, this, &MyClient::reconnect);这里的QTcpSocket::errorOccurred表示连接错误信号,当连接错误时会触发该信号,然后调用reconnect()槽函数,实现重连机制。
// 重连逻辑函数void MyClient::reconnect(){ // 确保当前socket已关闭(避免重复连接) if (socket->state() != QAbstractSocket::UnconnectedState) { socket->abort(); } // 延迟1秒后尝试重连 QTimer::singleShot(1000, this, &MyClient::connectToServer);}部分内容可能已过时