zoukankan      html  css  js  c++  java
  • JSON

    1,cJSON支持在C程序中创建和解析JSON数据,其提供多种方法供C程序使用,最直接的是将cJSON.c和cJSON.h加入到C工程中,源代码:https://github.com/DaveGamble/cJSON

    2, QJsonObject用于在Qt中创建JSON对象

    3,数据传输通过UDP运行

    Qt代码如下:

    首先在pro文件中加入

    QT += network

    h文件内容:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include<QtNetwork>
    
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
         QUdpSocket *sender;
        QByteArray byteArray;
    private slots:
         void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H

    cpp文件内容:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include<QJsonObject>
    #include<QJsonDocument>
    #include<QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        sender = new QUdpSocket(this);
    
        QJsonObject rectJson;
        rectJson.insert("Type","Rectangle");
        rectJson.insert("height",42);
        rectJson.insert("widght",23);
    
        QJsonDocument rectJsonDoc;
        rectJsonDoc.setObject(rectJson);
         byteArray = rectJsonDoc.toJson(QJsonDocument::Compact);
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
    
         QHostAddress address;
         address.setAddress(QString("192.168.230.140"));
           sender->writeDatagram(byteArray.data(),byteArray.size(),
                                address,4444);
    }

    Qt程序通过端口4444,向IP为192.168.230.140的主机发送JSON数据

    4,C程序如下:

    {
        int sock_fd;
        char rcv_buff[512];
        struct sockaddr_in client_addr;
        struct sockaddr_in server_addr;
        int client_len;
        int rcv_num = -1;
    
        if ((sock_fd = socket(AF_INET, SOCK_DGRAM,0)) < 0)
        {
            perror("socket create error
    ");
            exit(1);
        }
    
        memset(&server_addr,0,sizeof(struct sockaddr_in));
        
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(4444);
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
        client_len = sizeof(struct sockaddr_in);
    
        if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0)
        {
            perror("bind socket error.
    ");
            exit(1);
        }
        
        while (1)
        {
            /*zero the buff of rvbsm and hvbsm? zhp*/
                
            rcv_num= recvfrom(sock_fd, rcv_buff, sizeof(rcv_buff), 0, (struct sockaddr*)&client_addr, &client_len);
            if (rcv_num>0)
            {
                        rcv_buff[rcv_num] = '';
                        printf("rx bsm num = %d
    ",rcv_num);
                        //printf();
                            printf("%s %u says: %s
    ",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),rcv_buff);
                          //parse_UDP_data(rcv_num,rcv_buff);
    
                        if(rcv_buff != NULL)
                            {
                                cJSON* pJson = cJSON_Parse(rcv_buff);
                                if(pJson == NULL)
                                    {
                                        printf("Json Parse failed.
    ");
                                        return 0;
                                    }
                                cJSON* pSub1 = cJSON_GetObjectItem(pJson,"Type");
                                cJSON* pSub2 = cJSON_GetObjectItem(pJson,"height");
                                cJSON* pSub3 = cJSON_GetObjectItem(pJson,"widght");
                                if(pSub1!=NULL)
                                    {
                                        printf("Type : %s
    ", pSub1->valuestring);
                                    }
                                if(pSub2!=NULL)
                                    {
                                        printf("height : %d
    ", pSub2->valueint);
                                    }
                                if(pSub3!=NULL)
                                    {
                                        printf("widght : %d
    ", pSub3->valueint);
                                    }
                            }
                        
            }
            else
            {
                perror("recv BSM error
    ");
                break;
            }
        }
        close(sock_fd);
       
    }

    编译C程序:gcc -I. -lm -o rencode *.c

    由于cJSON使用了标准数学库,所以在编译中需链接其库文件-lm;

    在IP为192.168.230.140的linux服务器中执行./rencode

    输出结果为:

  • 相关阅读:
    level trigger 与 edge trigger 的区别
    使用ifstream时碰到的一个小问题
    转一篇 sed one line
    select(poll)效率,与异步网络IO,AIO, libevent, epoll
    类的成员函数指针的使用
    awk 的OFS使用 小 tips
    一句话打通所有机器,小脚本
    usleep sleep函数会重置clock 的返回值
    qstore 的 chunk重构小记
    判断质数的方法
  • 原文地址:https://www.cnblogs.com/Pan-Z/p/6425602.html
Copyright © 2011-2022 走看看