我是靠谱客的博主 鲤鱼可乐,最近开发中收集的这篇文章主要介绍Qt TCP多并发及心跳检测,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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多并发及心跳检测所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部