概述
TCP数据连接本身本不是一个多并发的网络通信方式,在Qt的TCP编程中与Linux下的TCP略有不同。在Qt中可通过线程+信号与槽机制来实现,TCP多并发特性。话不多说,上源码。
Thread_erupt这个类主要是为了实现,多并发而设计的。
.cpp文件:
Thread_erupt::Thread_erupt(QTcpSocket *sock)
{
// 传参来的socket赋值给private中的socket
socket = sock;
time_count=0;
delete_flag=false;
heartbeat=new QTimer(this);
connect(heartbeat,SIGNAL(timeout()),this,SLOT(detection()));
heartbeat->start(6000);
connect(socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(sock_error()));//出错
}
Thread_erupt::~Thread_erupt()
{
qDebug()<<"释放内存"<<endl;
if(socket!=NULL)
{
delete socket;
socket=NULL;
}
if(heartbeat!=NULL)
{
delete heartbeat;
heartbeat=NULL;
}
}
void Thread_erupt::sock_error()
{
qDebug()<<"tcp客户端请求关闭"<<endl;
socket->close();//关闭文件描述符
delete_flag=true;
//time_count=0;
//heartbeat->stop();
//emit Thread_delete(this);//传回自身
}
void Thread_erupt::run()
{
connect(socket,SIGNAL(readyRead()),this,SLOT(clientInfoSlot()));
}
void Thread_erupt::detection()
{
if(socket!=NULL)
{
time_count++;
qDebug()<<"心跳检测中"<<endl;
if(time_count>10)
{
socket->close();//断开连接
time_count=0;
heartbeat->stop();
emit Thread_delete(this);//传回自身
}else if(delete_flag==true)
{
delete_flag=false;
heartbeat->stop();
emit Thread_delete(this);//传回自身
}
}
}
void Thread_erupt::clientInfoSlot()
{
QByteArray ba;
ba.append(socket->readAll());
time_count=0;
emit sendToWidget(ba,socket); //emit: 发送自定义信号
}
.h文件
#include <QObject>
#include <QThread>
#include <QTcpSocket>
#include <QDebug>
#include <QTimer>
class Thread_erupt : public QThread
{
Q_OBJECT
public:
explicit Thread_erupt(QTcpSocket *sock);
~Thread_erupt();
void run(); //虚函数(线性处理函数)
signals:
void sendToWidget(QByteArray ba,QTcpSocket *socket);
void Thread_delete(Thread_erupt *thread);
public slots:
void clientInfoSlot();
void sock_error();
void detection();
private:
QTcpSocket *socket;
int time_count;
bool delete_flag;
QTimer *heartbeat;//心跳
};
结合QTimer定时器来对,TCP进行连接检测,将闲置的TCP连接进行关闭。
1.建立TCP服务器
tcpserver=new QTcpServer(this);
sockfd=NULL;
ret=tcpserver->listen(QHostAddress::Any,TCP_PORT);
if(!ret)
{
return;
}else
{
qDebug()<<"------------"<<endl;
connect(tcpserver,SIGNAL(newConnection()),this,SLOT(accept_ask()));
}
2.建立连接请求,没建立一个请求的同时开启一个线程管理TCP建立的请求连接
void ThreadNetworkControl::accept_ask()
{
sockfd=tcpserver->nextPendingConnection();
// 启动线程,传参sokect
Thread_erupt *t = new Thread_erupt(sockfd);//创建线程
// 开始线程
t->start();
connect(t,SIGNAL(sendToWidget(QByteArray,QTcpSocket*)),this,SLOT(receive(QByteArray,QTcpSocket*)));//接收信号
connect(t,SIGNAL(Thread_delete(Thread_erupt*)),this,SLOT(dele_thread(Thread_erupt*)));
}
3.对每个线程读取到的数据和该线程所持有的socket套接字进行处理
void ThreadNetworkControl::receive(QByteArray ba,QTcpSocket *mysockfd)
{
QString recvData;
QByteArray baSuccess = "Success";
QByteArray baFail = "Fail";
qDebug()<<"ba="<<ba<<endl;
mysockfd->write(baSuccess,baSuccess.length());
}
4.当TCP客户端断开连接或者服务器关闭闲置的TCP连接时,回收线程内存资源
void ThreadNetworkControl::dele_thread(Thread_erupt *mydelete)
{
delete mydelete;
qDebug()<<"线程内存释放"<<endl;
}
以上为Qt中TCP网络通信多并发简单的编写
最后
以上就是鲤鱼可乐为你收集整理的Qt TCP多并发及心跳检测的全部内容,希望文章能够帮你解决Qt TCP多并发及心跳检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复