TCP数据连接本身本不是一个多并发的网络通信方式,在Qt的TCP编程中与Linux下的TCP略有不同。在Qt中可通过线程+信号与槽机制来实现,TCP多并发特性。话不多说,上源码。

Thread_erupt这个类主要是为了实现,多并发而设计的。

.cpp文件:

Thread_erupt::Thread_erupt(QTcpSocket *sock)
{// 传参来的socket赋值给private中的socketsocket = 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();// 启动线程,传参sokectThread_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多并发及心跳检测相关推荐

  1. Java 使用Socket 实现基于DTU的TCP服务器 + 数据解析 + 心跳检测

    在物联网时代,DTU的运用非常广泛 :环境监测中通过DTU将传感器的数据远程传输至云服务器也是比较常见的用法.下面我来分享一下我的项目经验 1.物理连接拓扑 2.服务器后台流程 3.代码 设备TCP服 ...

  2. linux测试tcp长连接工具,Linux(服务器编程):44---TCP长连接、短连接(心跳检测)

    一.TCP连接的相关说明 ①使用TCP协议时,会在客户端和服务器之间建立一条虚拟的信道,这条虚拟信道就是指连接,而建议这条连接需要3次握手,拆毁这条连接需要4次挥手,可见,我们建立这条连接是有成本的, ...

  3. TCP通过带外数据实现心跳检测机制

    带外数据以及Linux下的设置 带外数据的概念:建立连接的双端,如果有一端有紧急的消息,可以立刻通知对方,而不是通过消息排队的机制进行告知. TCP没有真正的带外数据,而是设置了紧急指针来实现这一模式 ...

  4. swoole-面向连接(tcp)的心跳检测和合包分包

    以下讲的是tcp连接,client和server是tcp协议不再强调. 心跳检测 1,为什么需要心跳检测? tcp连接中,socket_listen()相当于电话处于监听状态,有N个client等待连 ...

  5. socket心跳检测

    一.什么是心跳检测 判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开. 基本原因是服务器端不能 ...

  6. 心跳检测以及应用层心跳包机制设计

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501(嵌入式方向) QQ交流群:856398158(后端方向) 目录 心跳检测应用场 ...

  7. netty的编解码、粘包拆包问题、心跳检测机制原理

    文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...

  8. haproxy心跳检测_haproxy 非常完整的配置

    常用配置选项: OPTION 选项: option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送 此cookie到HAP ...

  9. swoole实现Timer定时器、心跳检测及Task进阶实例:mysql连接池

    2019独角兽企业重金招聘Python工程师标准>>> Table of Contents 1.Timer定时器 2.心跳检测 3.Task进阶:MySQL连接池 环境说明: 系统: ...

最新文章

  1. 即墨php,即墨php培训
  2. Elasticsearch 100问(上)
  3. python cnn_Python · CNN(一)· 层结构
  4. iOS开发——MBProgressHUD 与 SVProgressHUD iOS提示框的优缺点
  5. python3异步协程爬虫_Python实现基于协程的异步爬虫
  6. sp_addlinkedserver oracle,sp_addlinkedserver使用方法
  7. 《流量的秘密: Google Analytics网站分析与优化技巧(第3版)》一2.2 网站分析中的cookie...
  8. Linux环境下通过gstack命令查看进程的运行堆栈信息
  9. linux oracle异常,Linux上oracle常见安装异常总结
  10. STM32 USB 问题汇总(转)
  11. android 扫描照片功能,巧把安卓手机打造成扫描仪:拍照识别文档、手写笔记转PDF(图)...
  12. QImage 图像格式小结
  13. 放苗机器人_智能化种植系统所用苗盘摆收机器人的制作方法
  14. Kafka权威指南-学习笔记---第一章
  15. 程序员到底要学什么?
  16. JPEGView(图片浏览编辑器)绿色版 v1.0.37
  17. 玩转Python,30行Python代码刷王者荣耀金币
  18. STM32精英版(正点原子STM32F103ZET6开发板)学习篇12——电容触摸按键实验
  19. Android肝帝战纪之字体图标库(iconify)的简单使用
  20. 细胞CLE19多肽荧光成像牛血清白蛋白荧光猝灭量子点的制备

热门文章

  1. 华为云之HECS云服务器配置docker环境
  2. 功能测试提测前必 做的几件事!
  3. requests下载图片的示例
  4. VR vs AR: 哪个有更大潜力改变未来
  5. 特征提取算法简单学习笔记
  6. 基层区域应用平台为目标开发的基础医疗云HIS系统源码
  7. 一定要让孩子知道的20个小故事
  8. 工具篇:分区扩展工具 resize2fs
  9. python安在d盘_python安装c盘还是d盘-女性时尚流行美容健康娱乐mv-ida网
  10. 微信小程序自定义组件事件跨越组件边界