概述
文章目录
- 1 注册套接字
- 2 编写处理事件
- 2.1 客户端(保持心跳和断开重连)
- 2.2 服务器
1 注册套接字
类声明中,声明变量
//是否是客户端
#define isClient 1
class ShowImage : public QWidget
{
Q_OBJECT
public:
ShowImage(QWidget *parent = nullptr);
~ShowImage();
private:
//服务器专属,用于建立监听事件
QTcpServer tcpServer;
//TCP套接字(客户端和服务器都要用到)
QTcpSocket* tcpSocket;
//监听或者连接的ip地址
QString IP = "192.168.0.1";
//断开重连计时
QTimer m_tcpServerTimer;
//连接的状态
bool m_tcpServerStatus = false;
private slots:
//回复心跳
void dealHeartBeat();
//连接服务器
void connectionServer();
//处理接受数据
void dealReceiveData();
//服客户端处理连接后的事件
void receiveConnect();
//断开连接后的处理事件
void tcpDisconnected();
//显示错误
void displayError(QAbstractSocket::SocketError);
};
构造函数中定义事件
ShowImage::ShowImage(QWidget *parent)
: QWidget(parent)
, ui(new Ui::ShowImage)
{
ui->setupUi(this);
#if isClient
///客户端
//建立套接字连接
tcpSocket = new QTcpSocket(this);
//处理接受连接 &QTcpSocket::connected
connect(tcpSocket, &QAbstractSocket::connected, this, &ShowImage::receiveConnect);
#else
//服务器
connect(&tcpServer, &QTcpServer::newConnection, this, &ShowImage::acceptConnection);
#endif
}
2 编写处理事件
2.1 客户端(保持心跳和断开重连)
- 保持心跳:直接在
receiveConnect()
函数中,启动定时器,设置时间到后的处理事件,然后一定时间间隔后重启定时器 - 重连:
- m_tcpServerStatus:网络连接状态,成功时为true,失败时为false;
- m_tcpServerTimer:用于重连的定时器,当网络连接成功时,停止定时器,当断开连接时,重启定时器
void receiveConnect()
{
//客户端连接状态成功
m_tcpServerStatus = true;
//连接成功后计时停止
m_tcpServerTimer.stop();
//启动定时器:用于发送心跳
QTimer *timer1= new QTimer(this);
//连接定时器的信号与槽,定时时间一到就会发送 timeout() 信号,从而触发槽函数dealHeartBeat(处理心跳)
connect(timer1, &QTimer::timeout, this, &ShowImage::dealHeartBeat);//心跳处理
//每隔 “time” 秒重启心跳定时器
timer1->start(15000);//15000ms
//接受数据
connect(tcpSocket, &QAbstractSocket::readyRead, this, &ShowImage::dealReceiveData);
//断开连接
connect(tcpSocket, &QAbstractSocket::disconnected, this, &ShowImage::tcpDisconnected);//与断开重连有关
//显示错误
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));
//断开连接后,定时重连服务器(使用lambda表达式)
connect(&m_tcpServerTimer, &QTimer::timeout, [=](){
if(m_tcpServerStatus == false){
tcpSocket->connectToHost(IP , 8899);
//断开与服务器的连接
//tcpSocket->abort();
}
});
}
断开连接的处理函数:
//断开连接时的处理
void ShowImage::tcpDisconnected()
{
m_tcpServerStatus = false;
//2秒重连,重启重连服务器的定时器
m_tcpServerTimer.start(2000);
}
2.2 服务器
- 处理心跳:在套接字处理函数
dealReceiveData
里面做心跳处理,当接受到的帧头和帧体是心跳时,给客户端回复心跳
//服务器用
void ShowImage::acceptConnection()
{
//获得链接套接字
tcpSocket = tcpServer.nextPendingConnection();
//接受数据,
connect(tcpSocket, &QAbstractSocket::readyRead, this, &ShowImage::dealReceiveData);
//断开连接
connect(tcpSocket, &QAbstractSocket::disconnected, this, &ShowImage::tcpDisconnected);
//显示错误
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));
}
- 服务器重新监听:
监听:
//开始监听
if(!tcpServer.listen(QHostAddress(IP) , 8899)){
qDebug() << tcpServer.errorString();
close();
return;
}
断开监听:
tcpServer.close();//断开服务
tcpSocket->disconnectFromHost();//断开套接字
最后
以上就是动人台灯为你收集整理的Qt中TCP保持心跳回复和断开重连1 注册套接字2 编写处理事件的全部内容,希望文章能够帮你解决Qt中TCP保持心跳回复和断开重连1 注册套接字2 编写处理事件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复