我正在尝试编写一段代码,使用QTcpSocket定期尝试连接到服务器,直到服务器准备好。当服务器下线时,客户端应该自动周期性地尝试重新连接,直到它再次上线或用户手动关闭程序。
我已经订阅了QTcpSocket的 connected 和 error 信号。当我捕获到错误信号时,我基本上会再次调用 connectToHost 方法。
我的代码定期尝试连接到主机,直到服务器准备就绪(这部分正常工作)。然而,问题是当服务器下线时它永远无法重新连接。当连接断开时,我像预期的那样得到 RemoteHostClosedError 错误。但是,在同一个方法中(我在其中捕获 RemoteHostClosedError)再次调用 connectToHost 方法后,我什么也没有得到。甚至 QTcpSocket 对象也没有发出错误信号。
我在下面给出了我的代码。
TcpServerConnector::TcpServerConnector( SocketSettings socketSettings, QObject* parent)
: QObject(parent), socket(new QTcpSocket())
{
this->connect(this->socket, SIGNAL(connected()), this, SLOT(connectionSuccess_Handler()), Qt::DirectConnection);
this->connect(this->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError_Handler(QAbstractSocket::SocketError)), Qt::DirectConnection);
}
void TcpServerConnector::connectionError_Handler( QAbstractSocket::SocketError error )
{
switch (error)
{
case QAbstractSocket::AddressInUseError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Address is already in use");
break;
case QAbstractSocket::ConnectionRefusedError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Connection refused");
break;
case QAbstractSocket::HostNotFoundError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Host not found");
break;
case QAbstractSocket::RemoteHostClosedError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Remote host closed");
break;
}
this->socket->abort();
this->socket->close();
this->logger.log(LogLevel::DEBUG, "Reconnecting...");
SystemUtil::sleepCurrentThread(1000);
this->socket->connectToHost(ip_address, port);
}
在调用connectToHost方法之前和之后,我会检查QTcpSocket的状态(我在这里提供的最后一行)。在调用connectToHost之前,状态为未连接状态,调用之后状态变为连接状态。这没有什么意外。但是,她既无法连接到服务器,也无法发出错误信号。
有什么想法吗?
注意:第一次内部调用QTcpSocket的connectToHost方法。