Qt之简易版网络调试助手

简述

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();
       }

    }
}

源码链接

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: QT网络调试助手是一款基于QT平台开发的网络调试工具。它的主要功能是辅助开发人员进行网络调试工作,能够对HTTP、TCP、UDP、WebSocket等协议进行解析和分析,提供可视化的界面展示,便于开发人员快速定位和解决问题。 QT网络调试助手具有以下几个主要特点: 1. 集成多种协议支持:QT网络调试助手支持HTTP、TCP、UDP、WebSocket等多种协议,能够解析协议包,展示数据信息。通过这些数据信息,可以快速定位和解决网络开发中出现的各种问题。 2. 监听端口支持:QT网络调试助手还支持监听指定端口,能够实时获取网络数据流,方便进行数据分析。同时,它还提供了响应数据修改的功能,可以在不影响源数据的情况下,对数据进行调整和修改。 3. 界面友好:QT网络调试助手提供了直观、友好的界面,包含请求列表、响应列表、WebSocket列表等多种显示模式,以及自定义筛选条件,让开发人员可以更加方便地操作和查看数据信息。 4. 精简实用:QT网络调试助手的设计十分精简实用,针对网络调试的核心需求进行了精心设计,避免了繁琐的操作过程和不必要的功能干扰。 总之,QT网络调试助手是一个功能强大、易于操作、界面友好的网络调试工具,可以帮助开发人员快速发现和解决网络开发中出现的各种问题。 ### 回答2: Qt网络调试助手是一款基于Qt框架开发的网络调试工具,它可以帮助开发人员在网络通信过程中对报文进行捕获、分析和调试Qt网络调试助手主要包括以下几个功能: 1. 报文捕获功能:Qt网络调试助手可以捕获网络通信过程中的请求报文和响应报文,并以可视化的方式展示出来。这对于开发人员来说非常重要,因为它可以帮助他们快速找到报文中的问题。 2. 报文分析功能:Qt网络调试助手可以对捕获的报文进行分析,包括解析HTTP协议、分析应用层协议等。开发人员可以通过这个功能更深入地了解网络通信的过程,更快地解决问题。 3. 报文编辑功能:Qt网络调试助手还可以对捕获的报文进行编辑,包括修改请求参数、请求头、响应参数、响应头等。这对于开发人员进行网络调试非常方便。 4. 报文保存功能:Qt网络调试助手还可以将捕获的报文保存到本地文件中,以便于之后的查看和分析。 总体来说,Qt网络调试助手是一款非常实用的网络调试工具,它为开发人员提供了捕获、分析、编辑和保存网络报文的功能,让开发人员更快地找到网络通信中的问题,并解决它们。同时它也是一款开源工具,可以帮助开源社区的发展。 ### 回答3: Qt网络调试助手是一款功能强大的网络调试工具。它能够帮助开发者快速识别和解决网络问题,是一个必备的调试工具。 Qt网络调试助手具有以下主要特点: 1. 支持多个网络协议 Qt网络调试助手支持常见的网络协议,如HTTP/HTTPS、TCP/UDP、WebSocket等。可以轻松地在这些协议之间进行切换,并查看它们的详细信息。 2. 支持数据的查看和编辑 在调试过程中,开发者可以实时查看请求和响应的数据,同时也可以编辑这些数据来模拟各种情况。 3. 支持数据的保存和发送 Qt网络调试助手也支持将数据保存到本地,以便后续分析。同时还可以发送数据到指定的地址,以便测试网络性能和稳定性。 4. 支持用户名和密码的验证 如果需要验证用户名和密码,Qt网络调试助手也可以轻松地完成验证过程。这非常有用,减少了开发人员的负担。 总之,Qt网络调试助手是一款十分实用的网络调试工具。它可以帮助开发人员快速定位和解决网络问题,提高工作效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值