本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

 

环境:

主机:WIN7

开发环境:Qt5 3.1.2

说明:

在tcp上传输xml消息.

协议格式如下:

2字节标识(0xc55c,网络序)+2字节预留 +4字节报文内容长度(网络序) + 4字节命令字(网络序)+报文内容

部分协议:

命令字:
请求值班信息:GET_DUTY_INFO
请求报文:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <request >
  3. <identifier>客户端的唯一标识符</identifier>
  4. </request>

回复报文:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <dutyinfo>
  3. <version>版本号</version>//表示车辆值班记录有无变化(如增减)
  4. <vehiclenum>车辆数目</vehiclenum>
  5. <vehicle>
  6. <dutyofvehicleuid>32位UUID</dutyofvehicleuid>
  7. <number>车辆编号, 如1,2,3,4</ number>
  8. <platenumber>车牌号</platenumber>
  9. <image>图片url</image>
  10. <liquidlevel>78</liquidlevel>//0至100
  11. </vehicle>
  12. <vehicle>
  13. <dutyofvehicleuid>32位UUID</dutyofvehicleuid>
  14. <number>车辆编号, 如1,2,3,4</ number>
  15. <platenumber>车牌号</platenumber>
  16. <image>图片url</image>
  17. <liquidlevel>78</liquidlevel>//0至100
  18. </vehicle>
  19. </dutyinfo>

处理思路:

1.发送:

调用qt中处理xml文件的类将所需要发送的信息保存为xml文件,然后读取文件,将文件转化为字节流,并拼接帧头,然后发送

2.接收

将接收的字节流去掉帧头后保存为xml文件,然后调用qt中处理xml文件的类读取其中的信息

源代码:

保存为xml文件

  1. //打开需要发送的xml命令
  2. QFile file(FILE_GET_DUTY_TX);
  3. //生成xml文件
  4. QDomDocument doc;
  5. QDomElement root_elem;
  6. QDomElement item;
  7. QDomText text;
  8. //xml文件头
  9. QString header("version=\"1.0\" encoding=\"UTF-8\"");
  10. doc.appendChild(doc.createProcessingInstruction("xml",header));
  11. //根元素
  12. root_elem = doc.createElement("request");
  13. doc.appendChild(root_elem);
  14. //元素:identifier
  15. item = doc.createElement("identifier");
  16. text = doc.createTextNode(QString(Local_Id));
  17. item.appendChild(text);
  18. root_elem.appendChild(item);
  19. //新建文件并保存
  20. file.open(QIODevice::WriteOnly);
  21. QTextStream out(&file);
  22. out.setCodec("UTF-8");
  23. doc.save(out,4,QDomNode::EncodingFromTextStream);
  24. file.close();

读取xml文件,得到字节流

  1. //读取xml文件
  2. file.open(QIODevice::ReadOnly);
  3. QTextStream get(&file);
  4. //得到xml数据
  5. Data_Xml_Tx = get.readAll().toLocal8Bit();
  6. file.close();

发送函数

  1. /*********************************************************************
  2. *                               槽函数:发送网络帧
  3. *参数:cmd:帧命令
  4. *    frame:发送的报文
  5. **********************************************************************/
  6. void Net::slot_net_tx_frame(int cmd,QByteArray frame)
  7. {
  8. QByteArray head;
  9. int i = 0;
  10. i = 0;
  11. //帧头
  12. head[i++] = 0xc5;
  13. head[i++] = 0x5c;
  14. //预留
  15. head[i++] = 0;
  16. head[i++] = 0;
  17. //报文长度
  18. head[i++] = frame.size() >> 24;
  19. head[i++] = frame.size() >> 16;
  20. head[i++] = frame.size() >> 8;
  21. head[i++] = frame.size();
  22. //命令字
  23. head[i++] = cmd >> 24;
  24. head[i++] = cmd >> 16;
  25. head[i++] = cmd >> 8;
  26. head[i++] = cmd;
  27. //组合帧
  28. frame.prepend(head);
  29. //判断当前是否连接上服务器
  30. if (tcp_client->state() == QAbstractSocket::ConnectedState)
  31. {
  32. //已连接上
  33. //发送数据
  34. tcp_client->write(frame);
  35. #ifdef DEBUG
  36. qDebug() << "发送网络帧1:cmd" << cmd;
  37. #endif
  38. }
  39. else
  40. {
  41. //未连接上
  42. Frame = frame;
  43. //连接服务器
  44. if (tcp_client->state() != QAbstractSocket::ConnectingState)
  45. {
  46. tcp_client->connectToHost(Server_Ip,Server_Port);
  47. }
  48. }
  49. }

tcp接收网络帧,并保存为xml文件,然后读取xml文件中的信息

  1. /*********************************************************************
  2. *                               接收完成处理
  3. **********************************************************************/
  4. void Get_Duty::deal_frame()
  5. {
  6. int sum = 0;
  7. int i = 0;
  8. QSqlQuery q;
  9. QString version;
  10. //解锁
  11. Lock_Net = 0;
  12. //放弃处理网络信息
  13. Net_Permission = 0;
  14. qDebug() << "接收帧:回复值班信息";
  15. //判断是否有值班信息
  16. if ((uint8_t)Frame.at(11) == 0)
  17. {
  18. //有标题,将数据存入xml文件
  19. //打开接收命令存储的xml文件
  20. QFile file(FILE_GET_DUTY_RX);
  21. //新建文件并保存
  22. file.open(QIODevice::WriteOnly);
  23. QTextStream out(&file);
  24. out.setCodec("UTF-8");
  25. out << Frame.mid(LEN_FRAME_HEAD);
  26. file.close();
  27. //打开xml文件
  28. QDomDocument doc(FILE_GET_DUTY_RX);
  29. //获取文件内容
  30. file.open(QIODevice::ReadOnly);
  31. doc.setContent(&file);
  32. file.close();
  33. //获得根节点
  34. QDomElement root_node = doc.documentElement();
  35. //获得第一个子节点:版本
  36. QDomNode node = root_node.firstChild();
  37. version = node.toElement().text();
  38. //判断版本号是否一致
  39. if (version == Version)
  40. {
  41. return;
  42. }
  43. //不一致
  44. Version = version;
  45. qDebug() << "版本号" << Version;
  46. //下一个子节点:车辆总数
  47. node = node.nextSibling();
  48. sum = node.toElement().text().toInt();
  49. qDebug() << "车辆总数" << sum;
  50. //清空前3辆车辆信息
  51. Car_Three_List[0].clear();
  52. Car_Three_List[1].clear();
  53. Car_Three_List[2].clear();
  54. //清空值班信息表
  55. q.prepare("DELETE FROM duty");
  56. q.exec();
  57. //写入数据库
  58. for (i = 0;i < sum;i++)
  59. {
  60. node = node.nextSibling();
  61. //插入数据
  62. q.prepare("INSERT INTO duty VALUES(?,?,?,?,?,?)");
  63. //uuid
  64. q.bindValue(0,node.toElement().childNodes().at(0).toElement().text());
  65. //编号
  66. q.bindValue(1,node.toElement().childNodes().at(1).toElement().text().toInt());
  67. //车牌
  68. q.bindValue(2,node.toElement().childNodes().at(2).toElement().text());
  69. //图片
  70. q.bindValue(3,node.toElement().childNodes().at(3).toElement().text());
  71. //汽油
  72. q.bindValue(4,node.toElement().childNodes().at(4).toElement().text().toInt());
  73. //图片标志
  74. q.bindValue(5,IMG_NULL);
  75. q.exec();
  76. //前3辆车辆信息输入
  77. if (i < 3)
  78. {
  79. Car_Three_List[i] = node.toElement().childNodes().at(0).toElement().text();
  80. }
  81. }
  82. //打印数据库
  83. //        q.prepare("SELECT * FROM duty");
  84. //        q.exec();
  85. //        while (q.next())
  86. //        {
  87. //            qDebug() << "uuid" << q.value(0).toString()
  88. //                     << "编号" << q.value(1).toInt()
  89. //                     << "车牌" << q.value(2).toString()
  90. //                     << "图片" << q.value(3).toString()
  91. //                     << "汽油" << q.value(4).toString()
  92. //                     << "图片标志" << q.value(5).toInt();
  93. //        }
  94. }
  95. else
  96. {
  97. Version = "null";
  98. //清空值班信息表
  99. q.prepare("DELETE FROM duty");
  100. q.exec();
  101. }
  102. //接收到值班信息
  103. emit sig_recv_duty_info();
  104. //清空接收缓存
  105. Frame.clear();
  106. Len_Frame_Content = 0;
  107. }

http://blog.csdn.net/jdh99/article/details/38677811

qt中用tcp传输xml消息 good的更多相关文章

  1. 在qt中用tcp传输xml消息

    在qt中用tcp传输xml消息 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上 ...

  2. Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)

    一.实现功能 1.服务器端选择待发送的文件,可以是多个 2.开启服务器,支持多客户端接入,能够实时显示每个客户端接入状态 3.等待所有客户端都处于已连接状态时,依次发送文件集给每个客户端,显示每个客户 ...

  3. Qt实现客户端与服务器消息发送与文件传输

    Qt实现客户端与服务器消息发送与文件传输需要使用到 QTcpSocket:提供套接字QTcpServer:提供基于TCP的服务端,官方文档的解释如下: This class makes it poss ...

  4. Qt实现客户端与服务器消息发送

    这里用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度. 环境:VS20013+ ...

  5. 基于Qt的Tcp协议的流程图

    TCP(Transmission Control Protocol传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.在qt中,Tcp协议主要是用QTcpServer和QTcpSock ...

  6. QT实现TCP通信服务器端和客户端(支持多个客户端)精简版

    上星期接了个私活,工期两星期,报酬3000,写一个小软件,采集定向网络上的数据,并进行双向通信,捣鼓了两天,终于把QT中tcp通信这块调通了,找过N多例子,绝大部分都是基本的一个服务端一个客户端通信的 ...

  7. Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...

  8. 转:TCP为什么要3次握手和4次挥手时等待2MSL、 TCP如何保证消息顺序以及可靠性到达

    关于tcp三次握手.四次挥手可以看这里:TCP与UDP的差别以及TCP三次握手.四次挥手 1.TCP为甚要3次握手? 在谢希仁著<计算机网络>第四版中讲“三次握手”的目的是“为了防止已失效 ...

  9. Java开发笔记(一百一十四)利用Socket传输文本消息

    前面介绍了HTTP协议的网络通信,包括接口调用.文件下载和文件上传,这些功能固然已经覆盖了常见的联网操作,可是HTTP协议拥有专门的通信规则,这些规则一方面有利于维持正常的数据交互,另一方面不可避免地 ...

随机推荐

  1. 利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bP ...

  2. 打造开发React Native的Sublime

     之前一年多一直用Sublime Text做前端开发,最近做React开发,发现不太好用,就尝试其他编辑器.WebStorm和VS Code都用过,WebStorm基本不用装插件,可以直接用,但用习惯 ...

  3. 读取和修改xml文件

    如有一个xml文件DownData.xml,内容如下 <?xml version="1.0" standalone="yes"?> <Root ...

  4. js typeof instanceof

    一般都是用typeof推断变量存在 例如if(typeof a!="undefined"){}.不是要去使用if(a)因为假定a不存在(未申报)将是错误的. 由于typeof经验n ...

  5. Hadoop和RDBMS的混合系统介绍

    现在大数据概念被时常提起,社会各界对其关注度越来越高.往往越是火热的东西,人们越容易忽略它的本质.在 slides 中,我首先按照自己的理解,简单的理顺数据处理领域的发展历程.之后,落脚点是两个比较有 ...

  6. 基于Web实现在线绘画拓扑图[GraphEditor]

    网络拓扑图本来已经整理有一段时间了,一次项目会议写集中边界监控系统的时候上级要求使用可以在系统中画网络拓扑图,没办法当时找不到现有的程序来参考 只能硬着头皮,顶着风险来完成[当然来边界安全的,当然要安 ...

  7. UVA - 10312 Expression Bracketing

    Description Problem A Expression Bracketing Input: standard input Output: standard output Time Limit ...

  8. [LeetCode] Subsets [31]

    题目 Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must ...

  9. MongoDB 可视化管理工具

    MongoDB 可视化管理工具 (2011年10月-至今)   正文 该项目从2011年10月开始开发,知道现在已经有整整5年了.MongoDB也从一开始的大红大紫到现在趋于平淡.MongoCola这 ...

  10. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 迁移数据 上一章节中我们配置了 ...