在网络传输中,会出现各种各样的情况,在长链接的使用中断网重连机制就显得尤为重要了。
一、需要断网重连的情况
接收不到数据的情况(网络闪断)接收到数据为空
二、断网检查方式
通过接收到数据是否
qDebug()
bool b_recv_flag = false;
if (!m_TcpSocket)
{
m_TcpSocket = new QTcpSocket();
connect(m_TcpSocket, SIGNAL(readyRead()), this, SLOT(onReadMsg()),Qt::DirectConnection);//让接受函数在run子线程中执行(发送者执行)
connect(m_TcpSocket, SIGNAL(connected()), this, SLOT(onConnect()));
connect(m_TcpSocket, SIGNAL(disconnected()), this, SLOT(onDisConnect()));
}
while (!m_isThreaStopped)
{
//检测客户端 socket指针是否为空
if(b_recv_flag)
msleep(100);
if (!m_isOkConect)
{
// 终止当前连接并重置套接字(立即关闭套接字,丢弃写缓冲区中的任何挂起数据)
m_TcpSocket->abort();
m_TcpSocket->connectToHost(m_QStrSocketIp, m_nSockPort);
//等待连接。。。延时三秒,三秒内连不上返回false
m_isOkConect = m_TcpSocket->waitForConnected(3000);
m_iRecv_TimeOut = -1;
}
if (!m_isOkConect)
{
msleep(1);
continue;
}
else
{
qDebug()
m_iRecv_TimeOut++;
if(m_iRecv_TimeOut>150) m_iRecv_TimeOut=150;
}
if(m_iRecv_TimeOut >= 150)
{
m_iRecv_TimeOut = -1;
m_TcpSocket->disconnectFromHost();
}
}
qDebug()
m_QStrSocketIp = ip;
m_nSockPort = port;
m_isThreaStopped = false;
start();
}
void TcpThread::stopThreaad()
{
qDebug()
if(m_TcpSocket->bytesAvailable()
// 接收数据
m_datagram.clear();
m_datagram.resize(m_TcpSocket->bytesAvailable());
m_TcpSocket->read(m_datagram.data(), m_datagram.size());
QString str_tcp_receive = QString::fromLocal8Bit(m_datagram);
msleep(100);
}
}
void TcpThread::onSendTcp()
{
if((!m_TcpSocket)||m_TcpSocket->state()!=QAbstractSocket::ConnectedState)
return;
QString str_info = "";
m_iSendData = m_TcpSocket->write(str_info.toStdString().c_str(), strlen(str_info.toStdString().c_str()));
m_TcpSocket->flush();
if (m_iSendData |