Qt TCP多并发及心跳检测
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多并发及心跳检测相关推荐
- Java 使用Socket 实现基于DTU的TCP服务器 + 数据解析 + 心跳检测
在物联网时代,DTU的运用非常广泛 :环境监测中通过DTU将传感器的数据远程传输至云服务器也是比较常见的用法.下面我来分享一下我的项目经验 1.物理连接拓扑 2.服务器后台流程 3.代码 设备TCP服 ...
- linux测试tcp长连接工具,Linux(服务器编程):44---TCP长连接、短连接(心跳检测)
一.TCP连接的相关说明 ①使用TCP协议时,会在客户端和服务器之间建立一条虚拟的信道,这条虚拟信道就是指连接,而建议这条连接需要3次握手,拆毁这条连接需要4次挥手,可见,我们建立这条连接是有成本的, ...
- TCP通过带外数据实现心跳检测机制
带外数据以及Linux下的设置 带外数据的概念:建立连接的双端,如果有一端有紧急的消息,可以立刻通知对方,而不是通过消息排队的机制进行告知. TCP没有真正的带外数据,而是设置了紧急指针来实现这一模式 ...
- swoole-面向连接(tcp)的心跳检测和合包分包
以下讲的是tcp连接,client和server是tcp协议不再强调. 心跳检测 1,为什么需要心跳检测? tcp连接中,socket_listen()相当于电话处于监听状态,有N个client等待连 ...
- socket心跳检测
一.什么是心跳检测 判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开. 基本原因是服务器端不能 ...
- 心跳检测以及应用层心跳包机制设计
博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501(嵌入式方向) QQ交流群:856398158(后端方向) 目录 心跳检测应用场 ...
- netty的编解码、粘包拆包问题、心跳检测机制原理
文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...
- haproxy心跳检测_haproxy 非常完整的配置
常用配置选项: OPTION 选项: option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送 此cookie到HAP ...
- swoole实现Timer定时器、心跳检测及Task进阶实例:mysql连接池
2019独角兽企业重金招聘Python工程师标准>>> Table of Contents 1.Timer定时器 2.心跳检测 3.Task进阶:MySQL连接池 环境说明: 系统: ...
最新文章
- 即墨php,即墨php培训
- Elasticsearch 100问(上)
- python cnn_Python · CNN(一)· 层结构
- iOS开发——MBProgressHUD 与 SVProgressHUD iOS提示框的优缺点
- python3异步协程爬虫_Python实现基于协程的异步爬虫
- sp_addlinkedserver oracle,sp_addlinkedserver使用方法
- 《流量的秘密: Google Analytics网站分析与优化技巧(第3版)》一2.2 网站分析中的cookie...
- Linux环境下通过gstack命令查看进程的运行堆栈信息
- linux oracle异常,Linux上oracle常见安装异常总结
- STM32 USB 问题汇总(转)
- android 扫描照片功能,巧把安卓手机打造成扫描仪:拍照识别文档、手写笔记转PDF(图)...
- QImage 图像格式小结
- 放苗机器人_智能化种植系统所用苗盘摆收机器人的制作方法
- Kafka权威指南-学习笔记---第一章
- 程序员到底要学什么?
- JPEGView(图片浏览编辑器)绿色版 v1.0.37
- 玩转Python,30行Python代码刷王者荣耀金币
- STM32精英版(正点原子STM32F103ZET6开发板)学习篇12——电容触摸按键实验
- Android肝帝战纪之字体图标库(iconify)的简单使用
- 细胞CLE19多肽荧光成像牛血清白蛋白荧光猝灭量子点的制备