IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 通过IP或者域名获取地理位置——Qt -> 正文阅读

[网络协议]通过IP或者域名获取地理位置——Qt

前言

现在通过IP获取所属地很火,不知道的请看微博:现在所有的用户都显示了IP的所属地。

我今天在学习QHostInfo的函数lookupHost 的时候,发现它可以获取域名的IP,然后联想到怎么怎么通过IP获取其地理位置,然后查了查资料,做出来了玩了玩。

效果图

我测试分别测试了域名(www.baidu.com)和某个IP。

?

原理

先通过QHostInfo的静态函数:

[static] int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)

来获取IP地址;

然后通过百度地图API的接口“普通IP定位来获取位置信息(百度地图API的文档很清楚,不懂的问度娘,这里不赘述)。

代码

由于代码太简单了,所以这里也不再一段段解释,直接贴代码(ps:这个代码写的很简陋,多包涵。)

//.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class QHostInfo;
class QNetworkAccessManager;

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_queryButton_clicked();
    void onHostLookedUp(const QHostInfo &host);
    void queryLocationOfIP(const QString& strIp);
    void replyFinished();

private:
    QVariantMap parseLocationData(const QByteArray& data);
    void showLocation(const QVariantMap& varMap);

private:
    Ui::Dialog *ui;
    QNetworkAccessManager* m_pNet;
};

#endif // DIALOG_H
//.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include<QMessageBox>
#include<QNetworkAccessManager>
#include<QHostInfo>
#include<QNetworkReply>
#include<QNetworkRequest>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonParseError>
#include<QDebug>

const static QString AK_STR="你的AK";


Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog),
    m_pNet(new QNetworkAccessManager(this))
{
    ui->setupUi(this);
    this->setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
    this->setWindowIcon(QIcon(":/head.jpg"));
    this->setWindowTitle(QStringLiteral("获取IP地理位置"));
    ui->plainTextEdit->setEnabled(false);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_queryButton_clicked()
{
    const QString& txt=ui->lineEdit->text();
    if(txt==""){
        QMessageBox::warning(this,QStringLiteral("提示"),QStringLiteral("请输入IP地址或域名!"));
        return;
    }
    ui->plainTextEdit->clear();
    QHostInfo::lookupHost(txt,this,SLOT(onHostLookedUp(QHostInfo)));
}

void Dialog::onHostLookedUp(const QHostInfo &host)
{
    if(host.error()!=QHostInfo::NoError){
        QMessageBox::information(this,QStringLiteral("提示"),host.errorString());
        return;
    }
    QList<QHostAddress> adds = host.addresses();
    if(adds.size()){
        const QHostAddress& addr = adds.first();
        queryLocationOfIP(addr.toString());
        qDebug()<<addr.toString();

    }
}

void Dialog::queryLocationOfIP(const QString &strIp)
{
    const QString& strUrl=QString("http://api.map.baidu.com/location/ip?ak=%1&ip=%2&coor=bd09ll").
            arg(AK_STR).arg(strIp);

    QNetworkRequest request;
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
    request.setUrl(QUrl(strUrl));

    QNetworkReply* reply =m_pNet->get(request);
    connect(reply,SIGNAL(finished()),this,SLOT(replyFinished()));

}

void Dialog::replyFinished()
{
    QNetworkReply* reply=qobject_cast<QNetworkReply *>(sender());

    if(reply->error()!=QNetworkReply::NoError){
        QMessageBox::information(this,QStringLiteral("提示"),QStringLiteral("请求出错:%1").arg(reply->errorString()));
    }
    const QByteArray& bytes=reply->readAll();
    const QVariantMap& varMap=parseLocationData(bytes);
    showLocation(varMap);

    reply->deleteLater();
}

QVariantMap Dialog::parseLocationData(const QByteArray &data)
{
    QJsonParseError error;
    QJsonDocument doc=QJsonDocument::fromJson(data,&error);
    if(error.error!=QJsonParseError::NoError){
        QMessageBox::information(this,QStringLiteral("提示"),QStringLiteral("JSON:数据结构有问题!"));
        return QVariantMap();
    }
    QJsonObject obj=doc.object();
    int status=obj.value("status").toInt();
    if(status!=0){
        QMessageBox::information(this,QStringLiteral("提示"),QStringLiteral("状态码:%1").arg(status));
        return QVariantMap();
    }
    QJsonObject contentObj=obj.value("content").toObject();
    qDebug()<<contentObj.value("address").toString();
    return contentObj.toVariantMap();
}

void Dialog::showLocation(const QVariantMap &varMap)
{
    const QString& addrStr=varMap.value("address").toString();
    const QVariantMap& ptMap=varMap.value("point").toMap() ;
    const QString& longitudeStr=ptMap.value("x").toString(); //经度
    const QString& latitudeStr=ptMap.value("y").toString(); //纬度
    const QString& txt=QStringLiteral("城市:%1 \n经度:%2   纬度:%3").arg(addrStr).arg(longitudeStr).arg(latitudeStr);
    ui->plainTextEdit->setPlainText(txt);
}

结束语

又多了一点奇奇怪怪的小知识。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:27:36  更:2022-05-08 08:27:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 10:35:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计