Qt项目通用类----------网络工具类

networkhelper.h

#ifndef NETWORKHELPER_H
#define NETWORKHELPER_H

#include <QObject>

class NetWorkHelper : public QObject
{
    Q_OBJECT
public:
    explicit NetWorkHelper(QObject *parent = nullptr);
    //判断IP地址及端口是否在线
    static bool ipLive(const QString &ip, int port, int timeout = 1000);
    //获取网页所有源代码
    static QString getHtml(const QString &url);
    //获取本机公网IP地址
    static QString getNetIP();
    //获取本机IP
    static QString getLocalIP();
    //字符串补全
    static QString getValue(quint8 value);
    //判断是否通外网
    static bool isWebOk();
signals:

};

#endif // NETWORKHELPER_H

networkhelper.cpp

#include "networkhelper.h"

#include <QEventLoop>
#include <QTimer>
#include <QTcpSocket>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkInterface>
#include <QHostInfo>

NetWorkHelper::NetWorkHelper(QObject *parent) : QObject(parent)
{

}
bool NetWorkHelper::ipLive(const QString &ip, int port, int timeout)
{
    //局部的事件循环,不卡主界面
    QEventLoop eventLoop;

    //设置超时
    QTimer timer;
    connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
    timer.setSingleShot(true);
    timer.start(timeout);

    QTcpSocket tcpSocket;
    connect(&tcpSocket, SIGNAL(connected()), &eventLoop, SLOT(quit()));
    tcpSocket.connectToHost(ip, port);
    eventLoop.exec();//一直循环直到定时器结束或者连接完成

    bool ok = (tcpSocket.state() == QAbstractSocket::ConnectedState);
    return ok;
}

QString NetWorkHelper::getHtml(const QString &url)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
    QByteArray responseData;
    QEventLoop eventLoop;
    QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
    eventLoop.exec();
    responseData = reply->readAll();
    return QString(responseData);
}


QString NetWorkHelper::getNetIP()
{    
    QString web = getHtml("http://whois.pconline.com.cn/");//需要专门查询ip地址的网址
    web = web.replace(' ', "");
    web = web.replace("\r", "");
    web = web.replace("\n", "");
    QStringList list = web.split("<br/>");
    QString tar = list.at(3);
    QStringList ip = tar.split("=");
    return ip.at(1);
}

QString NetWorkHelper::getLocalIP()
{
    //优先取192开头的IP,如果获取不到IP则取127.0.0.1
    QString localIp = "127.0.0.1";
    QList<QHostAddress> addrs = QNetworkInterface::allAddresses();
    foreach (QHostAddress addr, addrs) {
        QString ip = addr.toString();
        if (ip.startsWith("192.168.1") || ip.startsWith("192")) {
            localIp = ip;
            break;
        }
    }
    return localIp;
}


QString NetWorkHelper::getValue(quint8 value)
{
    QString result = QString::number(value);
    if (result.length() <= 1) {
        result = QString("0%1").arg(result);
    }
    return result;
}

bool NetWorkHelper::isWebOk()
{
    //能接通百度IP说明可以通外网
    return ipLive("180.101.49.11", 443);
}

参考文章:https://qtchina.blog.csdn.net/article/details/105616430

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YanWenCheng_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值