Qt之简易版网络调试助手

2023-05-16

简述

qt中为网络编程提供了一个QtNetwork类,使用QtNetwork可以实现ftp文件传输,基于tcp/ip协议的客户端和(服务端)开发等等,本文基于QtNetwork中的tcp/ip协议实现的简单版网络调试助手。
使用模块时需要在pro工程文件中加入:

QT       += network

效果

在这里插入图片描述

TCP服务端

QT对TCP/IP协议进行了封装,因此使用Qt创建一个TCP服务端变得简单。创建一个TCP服务端分为以下几个步骤:

  1. 新建一个socket,绑定新的客户端连接槽
  2. 监听
  3. 收发消息
    头文件:
#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QObject>

class QTcpServer;
class QTcpSocket;
class QTextEdit;
class TCPServer : public QObject
{
    Q_OBJECT
public:
    explicit TCPServer(QString ip="127.0.0.1",quint16 port=8080,QObject *parent = nullptr);
    ~TCPServer();
    //开启监听
    void listen();
    //获得连接数量
    int getConnectNum();
    //设置输出控件
    void setQTextEdit(QTextEdit *_edit);
    //设置ip
    void setip(QString _ip);
    //设置端口
    void setport(quint16 _port);
    //发送数据
    void sendData(QString data);
    void sendData(QString ip,QString data);
    //关闭服务端
    void closeServer();

signals:
    void connectfilsh();
    void disconnectfilsh();
protected slots:
    //新的客户端连接
    void newClient();
private:
    QString ip;	
    quint16 port;
    QTcpServer *tcpserver=nullptr;	//服务器
    QList<QTcpSocket *> clientlist;
    QTextEdit *eidt=nullptr;    //输出框
};

#endif // TCPSERVER_H

源文件

#include "tcpserver.h"

#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include <QString>
#include <QTextEdit>
#include <QMessageBox>

TCPServer::TCPServer(QString ip,quint16 port,QObject *parent) : QObject(parent),ip(ip),port(port)
{
	//新建一个tfp服务端并绑定客户端连接处理函数
    tcpserver=new QTcpServer();
    connect(tcpserver,&QTcpServer::newConnection,this,&TCPServer::newClient);
}

TCPServer::~TCPServer()
{
    if(tcpserver)
    {
        tcpserver->close();
        delete tcpserver;
    }
}
//开启监听
void TCPServer::listen()
{
    bool r=tcpserver->listen(QHostAddress(this->ip),this->port);
    if(r==false)
    {
        QMessageBox::information(nullptr,QStringLiteral("提示"),QStringLiteral("开启失败!"));
        return;
    }
    else
    {
//        QMessageBox::information(nullptr,QStringLiteral("提示"),QStringLiteral("开启成功!"));
        emit connectfilsh();
    }
}
//获得连接数量
int TCPServer::getConnectNum()
{
    return clientlist.length();
}
//设置输出
void TCPServer::setQTextEdit(QTextEdit *_edit)
{
    this->eidt=_edit;
}

void TCPServer::setip(QString _ip)
{
    this->ip=_ip;
}

void TCPServer::setport(quint16 _port)
{
    this->port=_port;
}
//发送数据,(默认向全部连接的客户端发送)
void TCPServer::sendData(QString data)
{
    for(auto cli:clientlist)
    {
        cli->write(data.toUtf8());
    }
}
//向指定ip的客户端发送数据
void TCPServer::sendData(QString ip, QString data)
{
    for(auto cli:clientlist)
    {
        if(cli->peerAddress().toString().contains(ip))
        {
            cli->write(data.toLocal8Bit());
            break;
        }
    }
}
//关闭服务端
void TCPServer::closeServer()
{
    if(tcpserver)
    {
        tcpserver->close();
        emit disconnectfilsh();
    }
}
//有新的客户端连接
void TCPServer::newClient()
{
	//获得连接的客户端指针
    QTcpSocket * client=tcpserver->nextPendingConnection();
    clientlist.push_back(client);
    connect(client,&QTcpSocket::readyRead,this,[this,client]{
        QString data =QString::fromLocal8Bit(client->readAll());
        if(eidt)
            eidt->append(data+"\n");
    });
    connect(client,&QTcpSocket::disconnected,this,[this,client]{
        QString address= client->peerAddress().toString();
//        qDebug()<<address<<QStringLiteral("已断开...")<<endl;
        client->close();
        clientlist.removeOne(client);
    });
}

TCP客户端

创建一个TCP客户端的步骤为:

  1. 新建一个客户端(QTcpSocket),绑定readyRead信号
  2. 连接至服务端(connectToHost)
  3. 收发数据
    头文件
#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QObject>

class QTcpSocket;
class QTextEdit;
class QTimer;
class TCPClient : public QObject
{
    Q_OBJECT
public:
    explicit TCPClient(QString ip,quint16 port,QObject *parent = nullptr);
    ~TCPClient();
    //连接服务器
    void connectServer();
    //设置输出控件
    void setQTextEdit(QTextEdit *_edit);
    //设置ip
    void setip(QString _ip);
    //设置端口
    void setport(quint16 _port);
    //发送数据
    void sendData(QString data);
    //关闭连接
    void close();
signals:
    void connectfilsh();
    void disconnectfilsh();
public slots:
    //读取数据
    void readData();
    //检查连接状态
    void checkConnectState();
private:
    QTcpSocket *client=nullptr;
    QTextEdit *edit=nullptr;
    QString ip;
    quint16 port;
    QTimer *timer=nullptr;  //定时器,检查连接状态
};

#endif // TCPCLIENT_H

源文件

#include "tcpclient.h"

#include <QTcpSocket>
#include <QTextEdit>
#include <QMessageBox>
#include <QTimer>

TCPClient::TCPClient(QString ip,quint16 port,QObject *parent) : QObject(parent),ip(ip),port(port)
{
	//新建一个tcp客户端
    client=new QTcpSocket();
    connect(client,&QTcpSocket::readyRead,this,&TCPClient::readData);
    //新建一个定时器,检查服务器是否主动断开
    timer=new QTimer();
    connect(timer,&QTimer::timeout,this,&TCPClient::checkConnectState);
    timer->start(1000);
}

TCPClient::~TCPClient()
{
    if(client)
        delete client;
    if(timer)
    {
        timer->stop();
        delete timer;
    }
}
//连接至服务器
void TCPClient::connectServer()
{
    client->connectToHost(ip,port);
    if(!client->waitForConnected())
    {
        QMessageBox::information(nullptr,QStringLiteral("提示"),QStringLiteral("连接失败,错误代码:")+QString::number(client->error()));
        delete  client;
        client=nullptr;
    }
    else
    {
        emit connectfilsh();
    }
}

void TCPClient::setQTextEdit(QTextEdit *_edit)
{
    this->edit=_edit;
}

void TCPClient::setip(QString _ip)
{
    this->ip=_ip;
}

void TCPClient::setport(quint16 _port)
{
    this->port=_port;
}
//发送数据
void TCPClient::sendData(QString data)
{
    if(client)
        client->write(data.toLocal8Bit());
}
//关闭客户端
void TCPClient::close()
{
    if(client)
    {
        client->close();
        emit disconnectfilsh();
    }

}
//读取数据
void TCPClient::readData()
{
    QString data=QString::fromLocal8Bit(client->readAll());
    edit->append(data+"\n");
}
//检查连接状态
void TCPClient::checkConnectState()
{
    if(client)
    {
       if(client->state()==QAbstractSocket::UnconnectedState)
       {
           client->close();
           emit disconnectfilsh();
       }

    }
}

源码链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt之简易版网络调试助手 的相关文章

  • 什么是API,SDK和API之间有什么关系呢?

    随着软件规模的日益庞大 xff0c 常常需要把复杂的系统划分成小的组成部分 xff0c 编程接口的设计十分重要 xff0c 程序设计的实践中 xff0c 编程接口的设计首先要使软件系统的职责得到合理划分 xff0c 良好的接口设计可以降低系
  • PX4下gazebo 仿真 offboard模式(ubuntu18.04)

    PX4下gazebo 仿真 offboard模式 xff08 ubuntu18 04 xff09 1 ros与gazebo安装 这里不多说了 xff0c 上网找教程或者按照ros官网教程安装完成ros melodic的完整版 xff0c g
  • px4与gazebo的多无人机编队仿真,offboard模式

    px4下基于ros和gazebo的多无人机编队仿真 xff0c offboard模式 单机的offboard仿真见https blog csdn net weixin 43409270 article details 114585397 多
  • 软件工程面向对象方法、Coad、Booch、OMT、UML方法

    1 Booch方法 Booch最先描述了面向对象的软件开发方法的基础问题 xff0c 指出面向对象开发是一种根本不同于传统的功能分解的设计方法 面向对象的软件分解更接近人对客观事务的理解 xff0c 而功能分解只通过问题空间的转换来获得 B
  • 机器人地面站-[QGroundControl源码解析]-[1]

    目录 前言 一 CmdLineOptParser 二 JsonHelper 三 KMLDomDocument 四 ShapeFileHelper 五 SHPFileHelper 六 KMLHelper 七 LogCompressor 总结
  • 机器人地面站-[QGroundControl源码解析]-[2]

    目录 前言 一 QGC 二 QGCComboBox 三 QGCFileDownload 四 QGCLoggingCategory 五 QGCMapPalette 六 QGCPalette 七 QGCQGeoCoordinate 八 QGCT
  • 机器人地面站-[QGroundControl源码解析]-[9]-[Camera]

    目录 前言 一 QGCCameraManager 二 QGCCameraIO 三 QGCCameraControl 前言 本篇介绍Camera文件夹下的内容 xff0c 该文件夹下又三个类文件 xff0c 分别是QGCCameraManag
  • C++开发精髓 阅读笔记

    第三章 pstack的使用 将C 43 43 类对象实例指针作为线程函数的参数 bind函数 span class token keyword auto span newCallable span class token operator
  • js逆向工具-油猴Tampermonkey脚本hook案例

    目录 一 油猴下载与安装二 油猴脚本免费使用网站三 油猴脚本编写介绍1 添加新脚本2 油猴脚本注释内容解释3 编写油猴脚本的基本步骤4 油猴脚本调试测试 四 hook之js逆向案例1 hook之window属性案例2 hook之cookie
  • js逆向案例-rus4逻辑学习

    目录 一 RS4特点二 网站请求流程特点三 网站加载js的顺序四 正式逻辑的研究1 cookie如何定位 xff1f 2 扣函数缺啥补啥注意事项 xff1f 3 如何获取 96 ts动态变量 96 值 xff1f 4 如何定位 96 MmE
  • js逆向案例-初学signature

    一 反爬点 案例网址 xff0c 向下滚动加载页面时的请求参数反爬signature xff0c 明显的特征 xff1a acrawler js以及window jsvmprt 34 二 反爬分析 参考文章1 xff0c 参考文章2 xff
  • Android逆向基础入门

    目录 一 基础App数据抓取1 App常用抓包工具2 fiddler抓包工具3 mitmdump抓包工具4 charles抓包工具5 uiautomatorviewer appium自动化工具6 Airtest自动化工具 二 js逆向与ap
  • 自动化测试工具-Airtest

    目录 一 Airtest介绍与安装二 Airtest基于图像识别自动控制手机App流程三 Airtest基于Poco的UI组件自动化控制App流程四 Airtest实现手机群控操作 一 Airtest介绍与安装 主要介绍区别 xff0c 以
  • Docker桌面版安装与使用(windows)

    目录 一 Docker概念二 下载安装三 docker镜像安装与操作四 制作自己的python镜像容器五 目录挂载六 多容器通信七 Docker Compose管理多个容器运行八 发布和部署九 备份数据迁移 一 Docker概念 1 Doc
  • Gradio 机器学习和数据科学开源 Python 库

    Gradio是一个开源的 Python 库 xff0c MIT的开源项目 xff0c 用于构建机器学习和数据科学演示和 Web 应用 Gradio的定位类似于Streamlit xff0c 但是更轻量 xff0c 因为它推荐的应用场景都是对
  • k8s安装

    目录 一 K8s概念二 minikube安装三 部署应用到集群中四 Service五 k8s部署爬虫1 意义 一 K8s概念 参考文章 xff0c 参考视频它是一个为 容器化 应用提供集群部署和管理的开源工具 xff0c 由 Google
  • 编程工具-GPT来AI编程代码

    一 安装介绍 1 https www cursor so 下载安装 xff0c 重要的说三遍 xff08 目前免费 xff01 免费 xff01 免费 xff01 xff09 xff0c 支持多平台 Mac Windows Linux xf
  • 某wipo专利_六宫格/cookie/css

    这里写目录标题 一 案例分析二 六宫格验证码三 列表页搜索式302四 详情页css链接cookie刷新 一 案例分析 案例网址 xff1a 案例网址 反爬点 xff1a 六宫格验证码 cookie反爬 时间强制等待 session数据强绑定
  • Python之urlencode()使用

    urlencode 传入参数类型 xff1a 字典功能 xff1a 将存入的字典参数编码为URL查询字符串 xff0c 即转换成以key1 61 value1 amp key2 61 value2的形式导入 xff1a from urlli

随机推荐

  • Python之Md5使用等加密

    目录 一 Python之md5使用二 Python之sha1使用三 Python之base64使用四 Python之rsa使用五 Python之aes des 一 Python之md5使用 功能 xff1a MD5签名是一个哈希函数 xff
  • Python之quote()使用

    quote 传入参数类型 xff1a 字符串功能 xff1a 将单个字符串编码转化为 xx 的形式导入 xff1a from urllib parse import quotePs xff1a url多个字符串编码用urlenocde 函数
  • ( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

    645 错误的集合 难度 xff1a 简单 集合 s 包含从 1 到 n 的整数 不幸的是 xff0c 因为数据错误 xff0c 导致集合里面某一个数字复制了成了集合里面的另外一个数字的值 xff0c 导致集合 丢失了一个数字 并且 有一个
  • Kalman滤波(Part-1:信号模型基础)

    Kalman Filters Dynamical Signal Models 一阶高斯 马尔可夫过程 first order Gauss Markov process 描述采样点之间 xff08 相邻 xff09 的相关性 xff1a s
  • 【STM32】关于keil5中下载按钮灰色及出现#error “Please select first the target STM32F4xx devic....错误的解决方法

    解决首次运行报错问题 近期在网上购买了一个WIFI模组 xff0c 例程是使用HAL库编写的 xff0c 首次编译的时候出现USER stm32f4xx h 193 error 35 error directive 34 Please se
  • 【STM32】F429单片机的时钟系统浅析

    先把429的时钟树附上 xff1a 乍一看是不是很懵逼 xff0c 我也很懵逼 一堆乱七八糟的玩意 xff0c ST公司是真的狗 本文是基于库函数SetSysClock 展开的 xff0c 配合该函数使用时钟树效果更佳O O 讲解之间说一个
  • x-easypdf 基于pdfbox/fop 封装的框架

    x easypdf 是一个基于 pdfbox fop 二次封装的框架 xff0c 目前拥有两大模块 xff1a pdfbox 模块 与 fop 模块 pdfbox 模块 主打 pdf 编辑功能 xff0c 以组件化的形式进行 pdf 的构建
  • 【STM32】利用定时器实现最基本的定时功能(HAL)

    定时器简介 STM32F429单片机有许多定时器Timer xff0c 主要分成三类 xff0c 基本定时器 xff1b 通用定时器和高级定时器 三种类型的定时器功能由少变多 xff0c 高级定时器包含了低级定时器的功能 基本定时器 xff
  • 【STM32】通俗易懂的讲解回调函数

    转载 xff1a https blog csdn net vincent040 article details 50832955 回调函数在程序开发中是一个非常重要的概念 xff0c 所谓的回调其实就是不同程序模块之间的接口和约定 xff0
  • 【树莓派】设置树莓派开机自动运行python脚本

    近期因科研需要 xff0c 需命令树莓派开机后无需进行任何操作自动运行一个python脚本 xff0c 经查阅部分资料后实现了该功能 xff0c 为方便以后查看特此记录一下 1 打开cmd xff0c 输入 sudo vim span cl
  • 部分机器人领域顶会顶刊官网及22年顶会召开时间

    顶刊 Science Robotics AAAS The International Journal of Robotics Research IJRR Journal of Forestry Research JFR IEEE Trans
  • 服务器非root下安装Python cyglfw3库

    服务器非root下安装Python cyglfw3库 在服务器中跑PVNet的代码时遇到的 xff0c 废了比较大的劲才解决 xff0c 特意记录一下解决过程 如果你有sudo权限直接使用sudo apt get install libgl
  • FFB6D搭建环境

    文章目录 FFB6D搭建环境搭建前的准备 根据需要选择性浏览 安装apex安装normal speed安装opencv3 安装pybind11安装normal speed 安装RandLA运行代码前的准备运行代码有疑问多多交流 xff0c
  • win32Day06:控件

    1 什么是控件 xff1f 控件是具备特殊功能的窗口 xff0c 并且有模板 控件的特性 xff1a 一定是子窗口 和创建主窗口一样 xff0c 都是使用CreateWindow函数来创建 xff08 控件这种 xff09 子窗口和主窗口的
  • SIFT3D点云关键点提取详细介绍

    1 引言 SIFT3D的理论基础完全是从图像特征SIFT2D中迁移类比过来的 xff0c 类似的还有Harris3D和Harris6D的理论也是来源于Harris2D的 xff0c 这些点云特征在PCL库中都有具体的实现 Harris3D和
  • 【视觉注意力机制集锦】引言

    视觉注意力机制集锦之引言 1 注意力机制 1 1 注意力机制简介 卷积神经网络具有很强的拟合数据的能力 xff0c 但是由于优化算法和计算能力的限制 xff0c 在实践中 xff0c 卷积网络很难达到通用近似的能力 特别是在处理规模较大的输
  • 期刊论文发表一定要有老师吗

    期刊论文发表一定要有老师吗 不一定 xff0c 具体要看论文的情况以及各方面的要求 xff0c 一般研究生和博士生论文很多都有老师 xff0c 本科论文很多是毕业生自己完成即可 xff0c 大多也是可以自己完成的 xff0c 如果要求有老师
  • QT菜单样式Ribbon Control for Qt, Office ribbon control

    基于Qt xff08 最低要求Qt5 xff0c 支持C 43 43 11的编译器 xff09 开发的一个轻量级的Ribbon控件 Office样式UI 使用Qt Creator直接打开SARibbon pro xff0c 并编译即可 xf
  • C/C++:基本语法看这一篇就够了

    前言 本文来自菜鸟教程的C语言教程和C 43 43 教程的学习笔记 xff0c 对其中的示例有所删减与变更 xff0c 建议以以下两个链接为准 虽说C 43 43 是C的扩展 xff0c 但貌似二者存在差集 xff0c 而本文只展示了兼容部
  • Qt之简易版网络调试助手

    简述 qt中为网络编程提供了一个QtNetwork类 xff0c 使用QtNetwork可以实现ftp文件传输 xff0c 基于tcp ip协议的客户端和 xff08 服务端 xff09 开发等等 xff0c 本文基于QtNetwork中的