QTcpSocket客户端自动重新连接

QTcpSocket客户端自动重新连接

问题描述:

我想写一段代码,定期尝试使用QTcpSocket连接到服务器,直到服务器启动并准备就绪。客户端还应该在服务器关闭时自动定期尝试重新连接,直到重新连接或用户手动关闭程序。QTcpSocket客户端自动重新连接

我所做的是订阅QTcpSocket的连接和错误信号。当我捕捉到错误信号时,我基本上再次调用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之前,状态为UnconnectedState,在调用connectToHost之后,其状态变为Connecting。没什么意外的但是,它既不能连接到服务器,也不能发出错误信号。

有什么想法?

注意:QTcpSocket的connectToHost metod是第一次在内部调用。

+0

不要从错误处理器插槽重新连接。 “当这个信号发出时,套接字可能没有准备好重新连接尝试。” [qt文档](http://doc.qt.io/qt-5/qabstractsocket.html#error-2) – 2015-06-12 11:46:43

对于那些可能遇到类似情况的人来说,QTcpSocket的重置方法解决了这个问题。

+0

当您解决问题时,您可以将自己的答案标记为正确。通过这种方式,搜索此人将很快找到解决方案。 – 2012-07-23 16:28:52

+2

请问你的解决方案... Tnx;) – 2013-07-24 07:54:43

我是过这种情况, 这是解决方案:

connect(&tcpClient, SIGNAL(disconnected()), SLOT(ReconnectToHost())); 


    void ReconnectToHost(){tcpClient.connectToHost(theServerAddress, port);} 
+0

哪里是断开信号?它是默认的还是用户定义的? – Sharath 2013-11-20 14:13:09