• Qt-network-http


    文章目录

    1、QT地址获取

    1.1 QT工程文件

    QT += network
    
    • 1

    1.2 相关类

    QHostAddress		IP地址
    
    QHostInfo		主机信息
    
    QNetworkInterface	主机的IP地址和网络接口列表
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 地址获取

        //获取主机名
        QString localHostName = QHostInfo::localHostName();
        ui->label_hostname->setText(localHostName);
    
        //获取本机的IP地址
        QHostInfo info = QHostInfo::fromName(localHostName);
        qDebug()<<"IP:"< address = info.addresses();
        foreach (QHostAddress addr, address)
        {
            //挑选出ipv4的地址
            if(addr.protocol() == QAbstractSocket::IPv4Protocol)
                qDebug()<
        QList addrs = QNetworkInterface::allAddresses();
        foreach (QHostAddress addr, addrs)
        {
            //挑选出ipv4的地址
            if(addr.protocol() == QAbstractSocket::IPv4Protocol
                    && addr.toString() != "127.0.0.1")
            {
                qDebug()<label_ip->setText(addr.toString());
            }
        }
        
        //访问更详细的网络接口信息
        QList list = QNetworkInterface::allInterfaces();
        foreach (QNetworkInterface i, list) {
            qDebug()< addressEntry = i.addressEntries();
            foreach (QNetworkAddressEntry j, addressEntry) {
               qDebug()<<"IP:"<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    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();//连接获取与新连接客户端的通讯套接字
    
        //可以把新连入的套接字存在一个集合里面
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (5)发送数据 write

    lsocket->write(“connect OK”);

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

    connect(lsocket, &QTcpSocket::readyRead, this, &MainWindow::read_data);
        
    void MainWindow::read_data()
    {
        //获取信号发送者
        QTcpSocket *msocket = dynamic_cast(sender());
        //读取数据
        QString msg = msocket->readAll();
     
        //得到发送者的IP
        QString ip = (msocket->peerAddress().toString()).remove(0, 7);
     
        ui->textBrowser->setText(ui->textBrowser->toPlainText().append(msg));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (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   //存放请求对象的类
    #include     //接收服务器回发的数据
    #include  //http通信过程管理类
    #include     //json的解析器
    #include       //对象
    #include        //数组
    #include        //值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.1 HTTP的客户端

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

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

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

    3.2 qt 实现

    #include 
    管理整个http通信,负责发送请求,后期应答
    请求:get  post  put
     
    #include 
    请求对象——请求数据放在这个对象中
     
    #include 
    当服务器回应的数据通过应答对象获取
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (1)创建管理类对象

    QNetworkAccessManager manager;

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

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

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

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

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

    void MainWindow::read_data(QNetworkReply *reply)
    {
        QByteArray array = reply->readAll();//读取所有数据
        qDebug()<label->setPixmap(map);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    
    • 1
    • 2
    • 3

    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   josn的解析器,实现json的读取写入
    
    #include 		对象
    
    #include 		数组
    
    #include 		值
    
    #include 	过程错误检查
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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);
        */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    6、UDP

    6.1 工程添加

    QT += network

    6.2 类的头文件

    #include 
    QUdpSocket
    
    • 1
    • 2

    6.3 数据发送端

    (1)QUdpSocket对象

    QUdpSocket msocket;

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

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

    6.4 数据接收

    (1)创建QUdpSocket对象

    QUdpSocket msocket;

    (2)绑定端口地址

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

    (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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6.5 广播

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

    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()));
    
    • 1

    (3)从多播组移除

    msocket.leaveMulticastGroup(QHostAddress(ui->lineEdit_groupIP->text()));
    
    • 1
  • 相关阅读:
    Java的synchronized关键字用法
    (二十六)数据结构-数组
    如何应对AI发展下的伦理挑战
    Flutter 中点击输入框之外的区域,进行失焦,收起键盘
    Linux学习
    【BOOST C++ 14 消息编程】(1) Boost.MPI
    【camera】【ISP】Lens Shading Correction镜头阴影校正
    JAVA系列之类加载机制详解
    C++11新特性:原始(raw)字符串
    求加django电影推荐系统中的推荐功能
  • 原文地址:https://blog.csdn.net/qq_45698138/article/details/126311885