QT server服务端如何判断客户端断开连接

在QT编程中有时会用到server服务端与客户端进行TCP网络通信,服务端部分代码如下:

1、创建server用于监听客户端套接字

this->server = new QTcpServer(this);
this->server->listen(QHostAddress::Any,5001);
connect(this->server,SIGNAL(newConnection()),this,SLOT(newConnection()));

2、newConnection()函数

//信号槽函数--新的设备连接
void Widget::newConnection()
{
    //查询空闲的套接字
    for(int i = 0; i<SOCKET_MAXNUM; i++)
    {
        if(!this->socketFlag[i])
        {
            this->socketIndex = i;
            break;
        }
    }
    this->socket[socketIndex] = this->server->nextPendingConnection();
    this->socketFlag[socketIndex] = SOCKET_FLAG_CONNECTED;
    connect(this->socket[socketIndex],SIGNAL(readyRead()),this,SLOT(readData()));
    scan_Device();
}

3、update_DeviceNetState()函数用于检测更新socket状态

//更新设备连接状态,清理释放过期的SOCKET
void Widget::update_DeviceNetState()
{
    int onlineDeviceNum = getChildItemCount(DEVICE_TB_ONLINE_DEVICE);
    qDebug()<<"Line-658 当前在线设备数量:"<<onlineDeviceNum;
    for(int i = 0;i<onlineDeviceNum;i++)
    {
        int socketID  = ui->DEVICE_TABLE->topLevelItem(DEVICE_TB_ONLINE_DEVICE)->child(i)->data(3,Qt::SocketIndex).toInt();
        bool netState = send_WakeHand(socket[socketID]);
        qDebug()<<"此设备在线? "<<netState;
        if(netState == STATE_OFFLINE)
        {
            clearSocket(socketID);
            deviceNetStateChange(i,DEVICE_TB_OFFLINE_DEVICE,DEVICE_TB_ONLINE_DEVICE,-1);
        }
    }
}

4、send_WakeHand(QTcpSocket *currSocket) 发送握手信号返回套接字返回值

//发送握手信号,判断设备是否掉线
bool Widget::send_WakeHand(QTcpSocket *currSocket)
{
    int ret = currSocket->write("wake hands");
    qDebug()<<"ret ="<<ret;
    if(ret == -1)
        return STATE_OFFLINE;
    return STATE_ONLINE;
}

5、利用定时器QTimer定时检查更新套接字状态

QTimer *timer = new QTimer(this);
//定时检查更新设备的网络状态
connect(timer,SIGNAL(timeout()),this,SLOT(update_DeviceNetState()));
timer->start(1000);

代码仅供学习参考,未经允许,禁止转载

时间: 2024-10-10 06:21:47

QT server服务端如何判断客户端断开连接的相关文章

SVN服务器搭建和使用(一)--下载、安装VisualSVN server 服务端和 TortoiseSVN客户端

前言: 在http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html的博客中已经很详细地介绍了SVN的服务器--VisualSVN server和客户端--TortoiseSVN的下载与安装.但笔者在按照其中的方法进行下载.安装时发现了此文遗漏了一些重要的细节,所以本文在搬运原文的基础上补上一些遗漏的细节,帮助读者只需看本页面即可完成所有的工作,而不必像我之前那样百度好几个才弄好.   一.SVN服务器--VisualSV

SVN--VisualSVN server 服务端和 TortoiseSVN客户端的基础使用

前言 在上一文http://www.cnblogs.com/wql025/p/5177699.html中,我们讲到了使用SVN的第一步,即下载.安装SVN的服务端软件--VisualSVN server和客户端软件--TortoiseSVN.现在,我们就来在此基础上学习怎样使用这两个软件的最基础的功能以及在eclipse上如何使用. 本文参考网址:http://blog.chinaunix.net/uid-26520343-id-3047514.html 首先,和oracle一样,用SVN服务端

[发布]SuperIO v2.2.5 集成OPC服务端和OPC客户端

SuperIO 下载:本站下载 百度网盘 1.修复串口号大于等于10的时候导致IO未知状态. 2.优化RunIODevice(io)函数内部处理流程,二次开发可以重载这个接口. 3.优化IO接收数据,提高运行效率. 4.优化OPC服务器端操作类库. 5.在Demo增加OPC服务端和OPC客户端事例源代码. [SuperIO教程]10.集成OPC Server和OPC Client插件服务 介绍 OPC服务端 OPC客户端 作者QQ:504547114 交流QQ群:54256083 官方网址:ht

Thrift操作(Python服务端和Nodejs客户端)

目录 前言 python服务端 nodejs客户端 win10运行thrift 测试 前言 操作系统win10 时间2019年02月 Thrift版本:Thrift version 0.11.0 Python版本: Python 3.5.2 Nodejs版本: node v8.9.3 参考网址1 python服务端 安装thrift python install thrift server.py # -*- coding: utf-8 -*- import json # 调用python安装的t

服务端主动给客户端推送消息

在了解这个之前,先要知道ajax,队列和递归 ajax操作 异步提交,局部刷新.用它就可以实现轮询/长轮询 创建django项目 views from django.shortcuts import render,HttpResponse import json from django.http import JsonResponse # Create your views here. # 验证ajax def ab_dy(request): if request.method == 'post

java网络编程TCP传输—流操作—服务端反馈与客户端接收

在读取完流后,服务端会向客户端返回一些数据,告诉客户端,已经写完了. 在这里和”流操作—拿到源后的写入动作“差不多,客户端同样以byte与Buffered两种缓冲读取作为例子,同时,.也是希望大家给补充. 1.利用OutputStream向客户端回写,客户端用byte作为缓冲接收 向客户端回写: 1 //获取socket输出流,将上传成功字样传给客户端 2 OutputStream out=s.getOutputStream(); 3 out.write("上传成功".getBytes

Web Service学习之服务端搭建与客户端调用

?工作中用到了Web Service,但是对这块不是很熟悉,决定花时间学习一下,现在记录一下最基本的入门知识点. 使用Java搭建Web Service服务端,使用Python脚本调用接口. 一.Web Service服务端 1.在Eclipse中新建一个Java工程,新建test.TestWebService类 package test; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public 

WCF 大数据量如何从服务端传到客户端

当数据量很大时,想要从服务端传到客户端可能会遇到这几个问题:基础连接意外关闭:内存溢出:或时间过长. 下面是我在项目中实现客户端导出txt文件时解决方法.txt有150M左右. namespace XSGLSRV900 //服务端接口实现 { public class XSGLService : IXSGLService { //这些变量只能是静态的,如果是非静态的,在客户端每一次调用服务端都认为是新建一个服务对象,这些值将不再能读取到.关于WCF服务端的三种模式可参考http://www.cn

centos 6.5环境利用iscsi搭建SAN网络存储服务及服务端target和客户端initiator配置详解

一.简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择.iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料. iSCSI是一种基于TCP/IP 的协议,用来建立和管理IP存储设备.主机和客户机等之间的相互连接,并创建存储区域网