Qt-network-http

文章目录

1、QT地址获取

1.1 QT工程文件

QT += network

1.2 相关类

QHostAddress		IP地址

QHostInfo		主机信息

QNetworkInterface	主机的IP地址和网络接口列表

1.3 地址获取

    //获取主机名
    QString localHostName = QHostInfo::localHostName();
    ui->label_hostname->setText(localHostName);

    //获取本机的IP地址
    QHostInfo info = QHostInfo::fromName(localHostName);
    qDebug()<<"IP:"<<info.addresses();
    QList<QHostAddress> address = info.addresses();
    foreach (QHostAddress addr, address)
    {
        //挑选出ipv4的地址
        if(addr.protocol() == QAbstractSocket::IPv4Protocol)
            qDebug()<<addr.toString();
    }
    
    //直接通过QNetworkInterface拿到QList<QHostAddress>
    QList<QHostAddress> addrs = QNetworkInterface::allAddresses();
    foreach (QHostAddress addr, addrs)
    {
        //挑选出ipv4的地址
        if(addr.protocol() == QAbstractSocket::IPv4Protocol
                && addr.toString() != "127.0.0.1")
        {
            qDebug()<<addr.toString();
            ui->label_ip->setText(addr.toString());
        }
    }
    
    //访问更详细的网络接口信息
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
    foreach (QNetworkInterface i, list) {
        qDebug()<<i.name();//网络接口名
        qDebug()<<i.hardwareAddress();//硬件地址
        //获取子网掩码和广播地址相关信息
        QList<QNetworkAddressEntry> addressEntry = i.addressEntries();
        foreach (QNetworkAddressEntry j, addressEntry) {
           qDebug()<<"IP:"<<j.ip().toString();
           qDebug()<<"子网掩码:"<<j.netmask().toString();
           qDebug()<<"广播地址:"<<j.broadcast().toString();
        }
    }

2、 TCP通信

2.1 服务器

QTcpServer:监听套接字(创建socket,绑定,监听,创建连接)

QTcpSocket:通讯套接字(建立连接的时候创建,收发数据)

(1)在工程文件里面添加

QT += network

(2)创建QTcpServer对象

#include QTcpServer mserver;

(3)调用方法开启监听

mserver.listen(QHostAddress::Any, ui->lineEdit->text().toUShort());

(4)当有客户端连接的时候,QTcpServer监听套接字,产生信号newConnection

connect(&mserver, &QTcpServer::newConnection, this, &MainWindow::new_client);
void MainWindow::new_client()
{
    QTcpSocket *lsocket = mserver.nextPendingConnection();//连接获取与新连接客户端的通讯套接字

    //可以把新连入的套接字存在一个集合里面
}

(5)发送数据 write

lsocket->write(“connect OK”);

(6)接收数据:当服务器接收到客户端放数据的时候,通信套接字会产生readyRead()信号

connect(lsocket, &QTcpSocket::readyRead, this, &MainWindow::read_data);
    
void MainWindow::read_data()
{
    //获取信号发送者
    QTcpSocket *msocket = dynamic_cast<QTcpSocket *>(sender());
    //读取数据
    QString msg = msocket->readAll();
 
    //得到发送者的IP
    QString ip = (msocket->peerAddress().toString()).remove(0, 7);
 
    ui->textBrowser->setText(ui->textBrowser->toPlainText().append(msg));
}

(7)关闭监听套接字

mserver.close();

2.2 客户端

QTcpSocket:通讯套接字(建立连接的时候创建,收发数据)

(1)在工程文件里面添加

QT += network

(2)创建QTcpSocket对象

#include QTcpSocket msocket;

(3)连接服务器connectToHost

msocket.connectToHost(ui->lineEdit_IP->text(), ui->lineEdit_Port->text().toUShort());

连接成功会产生一个connected信号

(4)接收数据 readyRead

connect(&msocket, &QTcpSocket::readyRead, this, &MainWindow::read_data);

void MainWindow::read_data() { QString msg = msocket.readAll(); ui->textBrowser->append(msg); }

(5)发送数据

msocket.write(ui->textEdit->toPlainText().toUtf8());

3 、HTTP通信

#include <QNetworkRequest>  //存放请求对象的类
#include <QNetworkReply>    //接收服务器回发的数据
#include <QNetworkAccessManager> //http通信过程管理类
#include <QJsonDocument>    //json的解析器
#include <QJsonObject>      //对象
#include <QJsonArray>       //数组
#include <QJsonValue>       //值

3.1 HTTP的客户端

(1)创建套接字——与服务器进行连接

(2)向服务器发送一个请求数据(http头、请求数据)

(3)如果请求合法,服务器就会返回请求的数据

3.2 qt 实现

#include <QNetworkAccessManager>
管理整个http通信,负责发送请求,后期应答
请求:get  post  put
 
#include <QNetworkRequest>
请求对象——请求数据放在这个对象中
 
#include <QNetworkReply>
当服务器回应的数据通过应答对象获取

(1)创建管理类对象

QNetworkAccessManager manager;

(2)调用对象的方法,发送请求

   QUrl url(ui->lineEdit->text());
    //创建一个请求对象
    QNetworkRequest request(url);
    //发送请求
    manager.get(request);

(3)当请求发送完毕管理类对象有一个finished信号产生,关联一个槽函数

connect(&manaer, &QNetworkAccessManager::finished, this, &MainWindow::read_data);

(4)在槽函数中获取应答对象并且通过应答对象读取服务器返回的数据

void MainWindow::read_data(QNetworkReply *reply)
{
    QByteArray array = reply->readAll();//读取所有数据
    qDebug()<<array;
    QPixmap map;//定义一个图片空间
    map.loadFromData(array);//给图片空间导入数据
    ui->label->setPixmap(map);
}

openssl

4、Apache

4.1 安装Apache服务器

sudo apt-get install apache2

4.2 查看apache的路径

cd /var/www/html/

原有文件:

index.html

4.3 在浏览器上直接输入服务器IP加文件路径名

4.3 在浏览器上直接输入服务器IP加文件路径名

服务器根路径:http://192.168.1.117
(/var/www/html/)
文件路径:http://192.168.1.117/picture/1.jpg

5、json数据格式与天气应用

5.1 json数据格式

https://blog.csdn.net/weixin_40877388/article/details/86526154

http://www.weather.com.cn/data/cityinfo/101010100.html

(1)对象{}

——在对象中只能出现键值对 “city”:“北京”(多个键值对,用 , 隔开)

键必须是字符串

键值对的值:

字符串

整数

浮点数

bool

对象

(2)数组[]——在数组里放相同类型的数据

[{}, {}, {}] 对象数组

[“”, “”, “”] 字符串数组

[1, 2, 3]整数数组

#include <QJsonDocument>  josn的解析器,实现json的读取写入

#include <QJsonObject>		对象

#include <QJsonArray>		数组

#include <QJsonValue>		值

#include <QJsonParseError>	过程错误检查

5.2 解析json数据


    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(array, &error);
    if(error.error != QJsonParseError::NoError)
    {
        qDebug()<<"json error";
        return;
    }
 
    QJsonObject obj = doc.object();
    QJsonObject dataobj = obj.value("data").toObject();
    QJsonArray forecast_Array = dataobj.value("forecast").toArray();
    QJsonObject day = forecast_Array[1].toObject();
    QString type = day.value("type").toString();
 
    ui->textBrowser->append("明天重庆的天气类型为:" + type);
 
    /*
    QJsonObject obj = doc.object();
    QJsonObject cityobj = obj.value("weatherinfo").toObject();//获取对象,这个对象是一个键的值
    QString city = cityobj.value("city").toString();
    QString htemp = cityobj.value("temp2").toString();
    QString ltemp = cityobj.value("temp1").toString();
 
    ui->textBrowser->append("城市:" + city);
    ui->textBrowser->append("最高温度:" + htemp);
    ui->textBrowser->append("最低温度:" + ltemp);
    */

6、UDP

6.1 工程添加

QT += network

6.2 类的头文件

#include <QUdpSocket>
QUdpSocket

6.3 数据发送端

(1)QUdpSocket对象

QUdpSocket msocket;

(2)直接调用发送数据的函数

msocket.writeDatagram(ui->textEdit->toPlainText().toUtf8(),              
                      QHostAddress(ui->lineEdit_IP->text()),              
                      ui->lineEdit_Port->text().toUShort());

6.4 数据接收

(1)创建QUdpSocket对象

QUdpSocket msocket;

(2)绑定端口地址

msocket.bind(QHostAddress::Any, ui->lineEdit_port->text().toUShort());

(3)关联信号和槽函数,接收消息

connect(&msocket, &QUdpSocket::readyRead, this, &MainWindow::read_data);
void MainWindow::read_data()
{
    char buf[1024] = {};
    QHostAddress address;
    quint16 port;
    msocket.readDatagram(buf, 1024, &address, &port);
    ui->textBrowser>setText("【" + address.toString().remove(0, 7) + 
                            "_" + QString::number(port) + "】"+ ":" + buf);
}

6.5 广播

msocket.writeDatagram(ui->textEdit->toPlainText().toUtf8(),
                          QHostAddress("192.168.1.255"),
                          ui->lineEdit_Port->text().toUShort());

6.6 组播

(1)地址:

网关地址:192.168.1.1

普通IP:192.168.1.2~254

广播地址:192.168.1.255

组播地址:

224.0.0.0 ~ 239.255.255.255

224.0.0.0 ~ 224.0.0.255:预留的组播地址(永久组地址)

224.0.1.0 ~ 224.0.1.255:公用组播地址

224.0.2.0 ~ 238.255.255.255:临时组地址(用户可用),全网范围有效

239.0.0.0 ~ 239.255.255.255:本地管理组播地址,仅在特定的本地范围内有效

(2)添加到多播组
msocket.joinMulticastGroup(QHostAddress(ui->lineEdit_groupIP->text()));
(3)从多播组移除
msocket.leaveMulticastGroup(QHostAddress(ui->lineEdit_groupIP->text()));
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yengi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值