专栏首页Pou光明Qt Socket Server 收发JSON

Qt Socket Server 收发JSON

之前文章写过Linux C Socket 收发Json数据,最近用Qt Server实现了一遍。给我自己的感觉就是cJSON接口与Qt封装的一些接口是共通的:Qt 封装了QJsonObject来对Json对象操作,如增删改查;封装了QJsonDocument来进行一些序列化与反序列化的操作(可能不准确)。

重要消息:虽然明天是端午节,但是还是要去公司学习。。。

后续可能会在公众号中写一点儿理财相关的知识,待定中......

程序中用到了Qt 的Socket Server,但主要介绍下Qt中如何操作Json数据,将接收到的字节流转换为Json对象,又如何将Json对象转换为字节流。

一、 程序介绍

1. Json 操作相关函数

为了与C语言写的对比,同样写了3个函数:

Qt :

int ParseRecvJsonData(const  QByteArray &recvdata, int *outLogLevel);
int WriteLogLevelToFileJson(const QString &filePathName, const int logLevel);
int CreateRespondInfoJson(QByteArray *respondInfoJson, 
                          const  QByteArray &recvJsonData,
                          const int writeFileRet);

C:

int ParseRecvJsonData(const char * recvdata, int *outLogLevel);
int WriteLogLevelToFileJson(const char *filePathName, int logLevel);
int CreateRespondInfoJson(char *respondInfoJson, 
                          const char* recvJsonData,
                          const int writeFileRet);

解析Json字节流为Json对象,提取所需信息

将所需信息组装成Json对象写入配置文件

将字节流转换为Json对象并添加数据,组装成响应信息

2. Qt 中对Json操作的具体实现

直接加注释进行说明

int TcpServerRecvImage::CreateRespondInfoJson(QByteArray *respondInfoJson,
               const QByteArray &recvJsonData, const int writeFileRet)
{
//使用QJsonDocument判断字节流能否转成Json对象
    QJsonParseError jsonError;
    QJsonDocument jsonRecvData(QJsonDocument::fromJson(recvJsonData, &jsonError));

    if(jsonError.error != QJsonParseError::NoError)
    {
        qDebug() << "parse json error!";
        return -1;
    }
//通过QsonDocument将字节流转为Json对象
    QJsonObject rootObject = jsonRecvData.object();
//向Json对象中追加数据
    rootObject.insert("Result","FAIL");

    if(0 == writeFileRet)
    {
//修改对应数据;可以思考下是如何实现修改前与修改后数据所占空间不同
        rootObject["Result"] = "SUCCESS";
    }
//将Json对象转换为字节流
    QJsonDocument documentJson;
    documentJson.setObject(rootObject);
    QByteArray bytearrayJson = documentJson.toJson();

    respondInfoJson->clear();
    respondInfoJson->append(bytearrayJson);

    return 0;
}

int TcpServerRecvImage::WriteLogLevelToFileJson(const QString &filePathName,
                           const int logLevel)
{
//Qt文件操作
    QFile f(filePathName);
    if(!f.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << "Open failed.";
        return -1;
    }

    // create JSON Object
    QJsonObject logLevelJson;
    logLevelJson.insert("logLevel",QString::number(logLevel));

    QJsonDocument documentJson;
    documentJson.setObject(logLevelJson);
    QByteArray bytearrayJson = documentJson.toJson();
//使用QTextStream,简化文件操作
    QTextStream txtWrite(&f);
    txtWrite << bytearrayJson;

    f.close();

    return 0;
}

3. 程序效果

客户端程序是之前的C语言写的

4. 一点感想

最近一段时间的状态就是不断看书,写Demo程序,并将以前看的一些知识结合起来,不断提炼总结,有一种这就是我想要的生活的错觉

本文分享自微信公众号 - Pou光明(pou0230),作者:PouG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux Socket 收发Json

    点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~

    用户5908113
  • HTTP server git

    基于QT的QTcpServer类实现简单的HTTP服务器Tinyhttpd。代码存放在Github。

    bear_fish
  • Qt Socket 收发图片——图像拆包、组包、粘包处理(二)

    之前给大家分享了一个使用python发图片数据、Qt server接收图片的Demo。之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用so...

    用户5908113
  • 一口气, 了解 Qt 的所有 IPC 方式 | Qt 速学

    Qt 里的 Qt Network 模块,提供了一些类,让网络编程变得更容易,且支持跨平台。

    用户8662056
  • 一口气, 了解 Qt 的所有 IPC 方式 | Qt 速学

    Qt 里的 Qt Network 模块,提供了一些类,让网络编程变得更容易,且支持跨平台。

    morixinguan
  • Linux Tcp通信——服务器与客户端

    之前一直想做linux+qt方向的,然而现在变成嵌入式软件方向了。其实也还好吧,这样就需要对底层的一些东西了解,目前是智能交通行业了。

    用户5908113
  • python Socket网络编程实现C/S模式和P2P

    由于网络课需要实现Socket网络编程,所以简单实现了一下,C/S模式分别用TCP/IP协议与UDP协议实现,下面将分别讲解。

    砸漏
  • 抓大放小,瞅瞅 Qt 的几个基础模块

    对于 Qt 初学者而言,首先需要学习的就是 Qt 的基础模块 ( Qt Essentials )。

    用户8662056
  • 初学Qt(二) 中高级功能列举

    上一次和大家聊了聊Qt的三大基类,信号和槽的使用以及重新实现一些事件等话题。如果在学习Qt之前有一定的C语言编程,可能对响应界面操作还会有些不习惯。这次聊一聊Q...

    用户5908113
  • Qt 线程中使用socket(勘误)

    之前写过两篇关于qt线程中使用socket的文章,昨天有小伙伴看了文章之后和我讨论,然后我发现有一篇文章有问题,今天特地更正一下,误导了之前的小伙伴表示歉意。

    用户5908113
  • Qt学习之路_6(Qt局域网聊天软件)

    http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html

    bear_fish
  • Qt学习之路_6(Qt局域网聊天软件)

    http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html

    bear_fish
  • Qt线程中使用socket作为客户端通信(二)

    Qt使用线程的方式有两种,一种是上次所说的继承QThread重新实现run()函数,在run()函数中一直循环处理;另一种则是继承QObject并使用moveT...

    用户5908113
  • Cplus_libs_wrapper-一些关于C++的常用功能的接口实现

    自己总结的一个有关C++的一些第三方库,包括示例和链接,目前已经托管到Github上面:Cplus_libs_wrapper

    ccf19881030
  • Qt下使用fork创建进程并使用socket通信

    之前在嵌入python解释器的过程中,我们没有处理这样一种情况:当Python解释器正在执行一个阻塞操作(比如socket server 在监听一个客户端连入)...

    用户5908113
  • Qt网络聊天室客户端

    QTcpSocket 是QAbstractSocket类非常方便的一个子类,让你创建一个TCP连接和数据流交流。

    DeROy
  • koa+socket.io尝试简单的web动作同步

    尝试用过browser-sync辅助开发的前端同学,大概都会感到神奇:在多个端打开网页,网页的动作却是完全同步的。

    用户1394570
  • Go语言之GRPC

    RPC叫做远程调用框架(Remote Procedure Call),远程调用原理如下所示:

    灰子学技术
  • windows环境下用c++实现socket编程

        socket即套接字,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。

    Sindsun

扫码关注云+社区

领取腾讯云代金券