你是对的,我之前给出的代码存在一个问题,即在连接成功后断开连接后就无法重新连接。为了解决这个问题,可以将重连逻辑放在断开连接的信号处理函数中。以下是修改后的代码示例:
QTcpSocket socket;
bool connected = false;
// 定义重连函数
void reconnect() {
qDebug() << "Disconnected from the server. Reconnecting...";
while (!connected) {
socket.connectToHost("127.0.0.1", 8808); // 连接到服务器
if(socket.waitForConnected()) {
qDebug() << "Reconnected to the server.";
connected = true;
while (connected) {
if (socket.waitForReadyRead()) { // 等待有数据可读
QByteArray data = socket.readAll(); // 读取所有可用数据
// 处理接收到的数据
processData(data);
}
}
socket.disconnectFromHost(); // 断开连接
} else {
qDebug() << "Failed to reconnect to the server.";
}
// 连接失败后等待一段时间再进行重连,避免频繁重连导致资源浪费
QThread::sleep(5);
}
}
// 连接成功的信号槽函数
void connectedSlot() {
qDebug() << "Connected to the server.";
connected = true;
}
// 连接断开的信号槽函数
void disconnectedSlot() {
connected = false;
QTimer::singleShot(1000, &reconnect); // 延时一段时间后进行重连
}
QObject::connect(&socket, SIGNAL(connected()), this, SLOT(connectedSlot()));
QObject::connect(&socket, SIGNAL(disconnected()), this, SLOT(disconnectedSlot()));
// 初始连接
socket.connectToHost("127.0.0.1", 8808); // 连接到服务器
if(socket.waitForConnected()) {
qDebug() << "Connected to the server.";
while (connected) {
if (socket.waitForReadyRead()) { // 等待有数据可读
QByteArray data = socket.readAll(); // 读取所有可用数据
// 处理接收到的数据
processData(data);
}
}
socket.disconnectFromHost(); // 断开连接
} else {
qDebug() << "Failed to connect to the server.";
}
这样,在断开连接后会通过一个延时定时器再次进行重连。在重连过程中,如果成功连接到服务器,则会继续保持通信,直到断开连接。如果发生异常断开,则会重新进入重连逻辑。请根据实际情况调整延时时间和退出循环的条件。
内容由零声教学AI助手提供,问题来源于学员提问