IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> QTcpSocket自动重连题 难道QTimer 还有坑? -> 正文阅读

[网络协议]QTcpSocket自动重连题 难道QTimer 还有坑?

?一直在弄 QT Tcp 客户端断线重连,之前方式为定时器槽触发后发起连接,如下,但定时器貌似不触发??????/

初版//

#include "mysocketImp.h"
MySocketImp::MySocketImp(QHostAddress ip, int port, int sockDesc, QObject *parent) :
?? ?MySocket(sockDesc,parent), status(false),m_ip(ip),m_port(port)
{
?? ?connect(this, SIGNAL(disconnected()), this, SLOT(dostateDisConnected()));
?? ?connect(this, SIGNAL(connected()), this, SLOT(dostateConnected()));
?? ?connect(&m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
?? ?//m_timer.start(3000);
?? ?//connect(&m_timer, &QTimer::timeout, this, &MySocketImp::slotTimeout);
}

MySocketImp::~MySocketImp()
{

}

void MySocketImp::Connect(const QHostAddress &ip, const int &port)
{
?? ?/*this->connectToHost(ip,port);
?? ?if(!this->waitForConnected(50))
?? ?{
?? ??? ?QString str = this->errorString();
?? ?}*/
?? ?m_timer.setInterval(3000);
?? ?m_timer.start();
?? ?this->connectToHost(ip, port);
?? ?if (!this->waitForConnected(50))
?? ?{
?? ??? ?//m_timer.stop();
?? ??? ?QString str = this->errorString();
?? ??? ?/*m_timer.setInterval(3000);
?? ??? ?m_timer.start();*/
?? ?}

}

void MySocketImp::slotTimeout()
{
?? ?if(!status)
?? ?{
?? ??? ?this->Connect(m_ip,m_port);//Connect
?? ?}
}
void MySocketImp::dostateConnected()
{
?? ?m_timer.stop();
?? ?status = true;
}
void MySocketImp::dostateDisConnected()
{
?? ?status = false;
?? ?this->abort();
?? ?m_timer.setInterval(3000);
?? ?m_timer.start(3000);
}

//改版

#include "mysocketImp.h"
MySocketImp::MySocketImp(QHostAddress ip, int port, int sockDesc, QObject *parent) :
?? ?MySocket(sockDesc,parent), status(false),m_ip(ip),m_port(port)
{
?? ?connect(this, SIGNAL(disconnected()), this, SLOT(dostateDisConnected()));
?? ?connect(this, SIGNAL(connected()), this, SLOT(dostateConnected()));
?? ?//connect(&m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
?? ?//m_timer.start(3000);
?? ?connect(&m_timer, &QTimer::timeout, this, &MySocketImp::slotTimeout);
?? ?m_timer.start(3000);
}

MySocketImp::~MySocketImp()
{

}

void MySocketImp::Connect(const QHostAddress &ip, const int &port)
{
?? ?this->connectToHost(ip,port);
?? ?if(!this->waitForConnected(50))
?? ?{
?? ??? ?QString str = this->errorString();
?? ?}
?? ?//m_timer.setInterval(3000);
?? ?//m_timer.start();
?? ?//this->connectToHost(ip, port);
?? ?//if (!this->waitForConnected(50))
?? ?//{
?? ?//?? ?//m_timer.stop();
?? ?//?? ?QString str = this->errorString();
?? ?//?? ?/*m_timer.setInterval(3000);
?? ?//?? ?m_timer.start();*/
?? ?//}
}

void MySocketImp::slotTimeout()
{
?? ?if(!status)
?? ?{
?? ??? ?this->Connect(m_ip,m_port);//Connect
?? ?}
}
void MySocketImp::dostateConnected()
{
?? ?//m_timer.stop();
?? ?status = true;
}
void MySocketImp::dostateDisConnected()
{
?? ?status = false;
?? ?//this->abort();
?? ?//m_timer.setInterval(3000);
?? ?//m_timer.start(3000);
}

/参考//

class?Widget?:?public?QWidget
{
????Q_OBJECT
public:
????explicit?Widget(QWidget?*parent?=?0);
????~Widget();
private?slots:
????void?readMessage();
????void?displayError(QAbstractSocket::SocketError);
????void?sendMessage();

????void?connected();
????void?disconnected();
????void?onError(QAbstractSocket::SocketError);
????void?onProgress();
private:
????QTcpSocket*?tcpsocket;
????bool?flag;
????QTimer?timer;
????QString?message;
????QPushButton*?button;
};

Widget::Widget(QWidget*?parent):
????QWidget(parent)
{
????button?=?new?QPushButton("Send");
????QVBoxLayout*?layout?=?new?QVBoxLayout(this);
????layout->addWidget(button);

????connect(button,SIGNAL(clicked()),this,SLOT(sendMessage()));

????tcpsocket?=?new?QTcpSocket(this);
????flag?=?false;
????//tcpsocket->abort();
????//tcpsocket->connectToHost("10.2.100.63",80);
????connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
????connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected()));
????connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(disconnected()));
????connect(tcpsocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError(QAbstractSocket::SocketError)));

????connect(&timer,SIGNAL(timeout()),this,SLOT(onProgress()));
????timer.start(1800);
}

Widget::~Widget()
{
}

void?Widget::onProgress()
{
????if(flag?==?false)
????{
????????tcpsocket->abort();
????????tcpsocket->connectToHost("10.2.100.63",80);
????}
}

void?Widget::readMessage()
{
????QString?tag?=?tcpsocket->readAll();
????std::cout<<"tag:"<<tag.size()<<std::endl;
}

void?Widget::displayError(QAbstractSocket::SocketError)
{
????qDebug()?<<?tcpsocket->errorString();
}

void?Widget::sendMessage()
{
????std::cout<<"write?callback?data."<<std::endl;
????tcpsocket->write("ok");????
}

void?Widget::connected()
{
????flag?=?true;
}

void?Widget::disconnected()
{
????flag?=?false;
}

void?Widget::onError(QAbstractSocket::SocketError)
{
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:27:45  更:2022-01-03 16:29:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:34:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码