qt中用tcp传输xml消息 good
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:WIN7
开发环境:Qt5 3.1.2
说明:
在tcp上传输xml消息.
协议格式如下:
2字节标识(0xc55c,网络序)+2字节预留 +4字节报文内容长度(网络序) + 4字节命令字(网络序)+报文内容
部分协议:
命令字:
请求值班信息:GET_DUTY_INFO
请求报文:
- <?xml version="1.0" encoding="UTF-8"?>
- <request >
- <identifier>客户端的唯一标识符</identifier>
- </request>
回复报文:
- <?xml version="1.0" encoding="UTF-8"?>
- <dutyinfo>
- <version>版本号</version>//表示车辆值班记录有无变化(如增减)
- <vehiclenum>车辆数目</vehiclenum>
- <vehicle>
- <dutyofvehicleuid>32位UUID</dutyofvehicleuid>
- <number>车辆编号, 如1,2,3,4</ number>
- <platenumber>车牌号</platenumber>
- <image>图片url</image>
- <liquidlevel>78</liquidlevel>//0至100
- </vehicle>
- <vehicle>
- <dutyofvehicleuid>32位UUID</dutyofvehicleuid>
- <number>车辆编号, 如1,2,3,4</ number>
- <platenumber>车牌号</platenumber>
- <image>图片url</image>
- <liquidlevel>78</liquidlevel>//0至100
- </vehicle>
- …
- </dutyinfo>
处理思路:
1.发送:
调用qt中处理xml文件的类将所需要发送的信息保存为xml文件,然后读取文件,将文件转化为字节流,并拼接帧头,然后发送
2.接收
将接收的字节流去掉帧头后保存为xml文件,然后调用qt中处理xml文件的类读取其中的信息
源代码:
保存为xml文件
- //打开需要发送的xml命令
- QFile file(FILE_GET_DUTY_TX);
- //生成xml文件
- QDomDocument doc;
- QDomElement root_elem;
- QDomElement item;
- QDomText text;
- //xml文件头
- QString header("version=\"1.0\" encoding=\"UTF-8\"");
- doc.appendChild(doc.createProcessingInstruction("xml",header));
- //根元素
- root_elem = doc.createElement("request");
- doc.appendChild(root_elem);
- //元素:identifier
- item = doc.createElement("identifier");
- text = doc.createTextNode(QString(Local_Id));
- item.appendChild(text);
- root_elem.appendChild(item);
- //新建文件并保存
- file.open(QIODevice::WriteOnly);
- QTextStream out(&file);
- out.setCodec("UTF-8");
- doc.save(out,4,QDomNode::EncodingFromTextStream);
- file.close();
读取xml文件,得到字节流
- //读取xml文件
- file.open(QIODevice::ReadOnly);
- QTextStream get(&file);
- //得到xml数据
- Data_Xml_Tx = get.readAll().toLocal8Bit();
- file.close();
发送函数
- /*********************************************************************
- * 槽函数:发送网络帧
- *参数:cmd:帧命令
- * frame:发送的报文
- **********************************************************************/
- void Net::slot_net_tx_frame(int cmd,QByteArray frame)
- {
- QByteArray head;
- int i = 0;
- i = 0;
- //帧头
- head[i++] = 0xc5;
- head[i++] = 0x5c;
- //预留
- head[i++] = 0;
- head[i++] = 0;
- //报文长度
- head[i++] = frame.size() >> 24;
- head[i++] = frame.size() >> 16;
- head[i++] = frame.size() >> 8;
- head[i++] = frame.size();
- //命令字
- head[i++] = cmd >> 24;
- head[i++] = cmd >> 16;
- head[i++] = cmd >> 8;
- head[i++] = cmd;
- //组合帧
- frame.prepend(head);
- //判断当前是否连接上服务器
- if (tcp_client->state() == QAbstractSocket::ConnectedState)
- {
- //已连接上
- //发送数据
- tcp_client->write(frame);
- #ifdef DEBUG
- qDebug() << "发送网络帧1:cmd" << cmd;
- #endif
- }
- else
- {
- //未连接上
- Frame = frame;
- //连接服务器
- if (tcp_client->state() != QAbstractSocket::ConnectingState)
- {
- tcp_client->connectToHost(Server_Ip,Server_Port);
- }
- }
- }
tcp接收网络帧,并保存为xml文件,然后读取xml文件中的信息
- /*********************************************************************
- * 接收完成处理
- **********************************************************************/
- void Get_Duty::deal_frame()
- {
- int sum = 0;
- int i = 0;
- QSqlQuery q;
- QString version;
- //解锁
- Lock_Net = 0;
- //放弃处理网络信息
- Net_Permission = 0;
- qDebug() << "接收帧:回复值班信息";
- //判断是否有值班信息
- if ((uint8_t)Frame.at(11) == 0)
- {
- //有标题,将数据存入xml文件
- //打开接收命令存储的xml文件
- QFile file(FILE_GET_DUTY_RX);
- //新建文件并保存
- file.open(QIODevice::WriteOnly);
- QTextStream out(&file);
- out.setCodec("UTF-8");
- out << Frame.mid(LEN_FRAME_HEAD);
- file.close();
- //打开xml文件
- QDomDocument doc(FILE_GET_DUTY_RX);
- //获取文件内容
- file.open(QIODevice::ReadOnly);
- doc.setContent(&file);
- file.close();
- //获得根节点
- QDomElement root_node = doc.documentElement();
- //获得第一个子节点:版本
- QDomNode node = root_node.firstChild();
- version = node.toElement().text();
- //判断版本号是否一致
- if (version == Version)
- {
- return;
- }
- //不一致
- Version = version;
- qDebug() << "版本号" << Version;
- //下一个子节点:车辆总数
- node = node.nextSibling();
- sum = node.toElement().text().toInt();
- qDebug() << "车辆总数" << sum;
- //清空前3辆车辆信息
- Car_Three_List[0].clear();
- Car_Three_List[1].clear();
- Car_Three_List[2].clear();
- //清空值班信息表
- q.prepare("DELETE FROM duty");
- q.exec();
- //写入数据库
- for (i = 0;i < sum;i++)
- {
- node = node.nextSibling();
- //插入数据
- q.prepare("INSERT INTO duty VALUES(?,?,?,?,?,?)");
- //uuid
- q.bindValue(0,node.toElement().childNodes().at(0).toElement().text());
- //编号
- q.bindValue(1,node.toElement().childNodes().at(1).toElement().text().toInt());
- //车牌
- q.bindValue(2,node.toElement().childNodes().at(2).toElement().text());
- //图片
- q.bindValue(3,node.toElement().childNodes().at(3).toElement().text());
- //汽油
- q.bindValue(4,node.toElement().childNodes().at(4).toElement().text().toInt());
- //图片标志
- q.bindValue(5,IMG_NULL);
- q.exec();
- //前3辆车辆信息输入
- if (i < 3)
- {
- Car_Three_List[i] = node.toElement().childNodes().at(0).toElement().text();
- }
- }
- //打印数据库
- // q.prepare("SELECT * FROM duty");
- // q.exec();
- // while (q.next())
- // {
- // qDebug() << "uuid" << q.value(0).toString()
- // << "编号" << q.value(1).toInt()
- // << "车牌" << q.value(2).toString()
- // << "图片" << q.value(3).toString()
- // << "汽油" << q.value(4).toString()
- // << "图片标志" << q.value(5).toInt();
- // }
- }
- else
- {
- Version = "null";
- //清空值班信息表
- q.prepare("DELETE FROM duty");
- q.exec();
- }
- //接收到值班信息
- emit sig_recv_duty_info();
- //清空接收缓存
- Frame.clear();
- Len_Frame_Content = 0;
- }
http://blog.csdn.net/jdh99/article/details/38677811
qt中用tcp传输xml消息 good的更多相关文章
- 在qt中用tcp传输xml消息
在qt中用tcp传输xml消息 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上 ...
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
一.实现功能 1.服务器端选择待发送的文件,可以是多个 2.开启服务器,支持多客户端接入,能够实时显示每个客户端接入状态 3.等待所有客户端都处于已连接状态时,依次发送文件集给每个客户端,显示每个客户 ...
- Qt实现客户端与服务器消息发送与文件传输
Qt实现客户端与服务器消息发送与文件传输需要使用到 QTcpSocket:提供套接字QTcpServer:提供基于TCP的服务端,官方文档的解释如下: This class makes it poss ...
- Qt实现客户端与服务器消息发送
这里用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度. 环境:VS20013+ ...
- 基于Qt的Tcp协议的流程图
TCP(Transmission Control Protocol传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.在qt中,Tcp协议主要是用QTcpServer和QTcpSock ...
- QT实现TCP通信服务器端和客户端(支持多个客户端)精简版
上星期接了个私活,工期两星期,报酬3000,写一个小软件,采集定向网络上的数据,并进行双向通信,捣鼓了两天,终于把QT中tcp通信这块调通了,找过N多例子,绝大部分都是基本的一个服务端一个客户端通信的 ...
- Android设备一对多录屏直播--(UDP组播连接,Tcp传输)
原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...
- 转:TCP为什么要3次握手和4次挥手时等待2MSL、 TCP如何保证消息顺序以及可靠性到达
关于tcp三次握手.四次挥手可以看这里:TCP与UDP的差别以及TCP三次握手.四次挥手 1.TCP为甚要3次握手? 在谢希仁著<计算机网络>第四版中讲“三次握手”的目的是“为了防止已失效 ...
- Java开发笔记(一百一十四)利用Socket传输文本消息
前面介绍了HTTP协议的网络通信,包括接口调用.文件下载和文件上传,这些功能固然已经覆盖了常见的联网操作,可是HTTP协议拥有专门的通信规则,这些规则一方面有利于维持正常的数据交互,另一方面不可避免地 ...
随机推荐
- 查询系统状态 内存大小 cpu信息 设备负载情况
1.1 查看内存状态 /proc/meminfo里面存放着内存的信息 查看内存命令(包括虚拟内存swap): free -h (低版本系统可能不支持-h) 或者 free -m (以mb单位显示) a ...
- Swift 中的高阶函数和函数嵌套
高阶函数 在Swift中,函数可做为“一等公民”的存在,也就意味着,我们可以和使用 int 以及 String 一样,将函数当做 参数.值.类型来使用. 其中,将函数当作一个参数和值来使用可见下: t ...
- RStudio 的使用
0. 基本 路径查看和设置: getwd() ⇒ 查看路径 setwd() ⇒ 设置路径: 1. 快捷键 ctrl+shift+c:多行注释:选中待注释的代码段,按下 ctrl+shift+c(c 表 ...
- Spring实战5-基于Spring构建Web应用
主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右工作经验的人,这篇文章的作者用精练 ...
- Crystal Report - 利用后台代码设计或实现水晶报表工具栏相关功能
水晶报表工具栏分页按钮响应事件: 水晶报表中有自带的分页功能,在设置好每页显示的记录后会自动分页,并自动记录总页数和保存当前页,在工具栏可以通过“首页”“尾页”“下一页”“上一页”和“跳页”进行页面跳 ...
- C# 7.0 使用下划线忽略使用的变量
原文:C# 7.0 使用下划线忽略使用的变量 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee. ...
- 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...
- 微信公众平台消息接口开发(31)微信浏览器HTTP_USER_AGENT判断
微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 微信浏览器 HTTP_USER_AGENT作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archiv ...
- HDU 4357 String change 法冠军
意甲冠军: 鉴于a串b串,问我们能否a变b串 办法:自选a的2快报,ascil+=1 然后交换位置,能够操作自如倍. 3个月3以上就能T^T 2法官将着眼于暴力 #include <cstdio ...
- Unity3d 鼠标的事件GetMouseButtonDown()、GetMouseButton()、GetMouseButtonUp()
当鼠标按键按下时,返回一次true,后面參数0是左键,1是右键,2是中键 if(Input.GetMouseButtonDown(0)) Debug.Log("Pressed left cl ...