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网络通信多并发简单的编写

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值