qt中用tcp傳輸xml消息 good

本文博客連接:http://blog.csdn.net/jdh99,做者:jdh,轉載請註明.html

 

環境:node

主機:WIN7數據庫

開發環境:Qt5 3.1.2緩存

 

說明:服務器

在tcp上傳輸xml消息.網絡

 

協議格式以下:app

2字節標識(0xc55c,網絡序)+2字節預留 +4字節報文內容長度(網絡序) + 4字節命令字(網絡序)+報文內容tcp

 

部分協議:ide

命令字:
請求值班信息:GET_DUTY_INFO
請求報文:函數

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <request >  
  3. <identifier>客戶端的惟一標識符</identifier>  
  4. </request>  

 

 


回覆報文:

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  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. …  
  20. </dutyinfo>  

 

 

處理思路:

1.發送:

調用qt中處理xml文件的類將所須要發送的信息保存爲xml文件,而後讀取文件,將文件轉化爲字節流,並拼接幀頭,而後發送

 

2.接收

將接收的字節流去掉幀頭後保存爲xml文件,而後調用qt中處理xml文件的類讀取其中的信息

 

源代碼:

保存爲xml文件

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  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.   
  9.     //xml文件頭  
  10.     QString header("version=\"1.0\" encoding=\"UTF-8\"");  
  11.     doc.appendChild(doc.createProcessingInstruction("xml",header));  
  12.   
  13.     //根元素  
  14.     root_elem = doc.createElement("request");  
  15.     doc.appendChild(root_elem);  
  16.   
  17.     //元素:identifier  
  18.     item = doc.createElement("identifier");  
  19.     text = doc.createTextNode(QString(Local_Id));  
  20.     item.appendChild(text);  
  21.     root_elem.appendChild(item);  
  22.   
  23.     //新建文件並保存  
  24.     file.open(QIODevice::WriteOnly);  
  25.     QTextStream out(&file);  
  26.     out.setCodec("UTF-8");  
  27.     doc.save(out,4,QDomNode::EncodingFromTextStream);  
  28.     file.close();  


讀取xml文件,獲得字節流

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //讀取xml文件  
  2.     file.open(QIODevice::ReadOnly);  
  3.     QTextStream get(&file);  
  4.     //獲得xml數據  
  5.     Data_Xml_Tx = get.readAll().toLocal8Bit();  
  6.     file.close();  


發送函數

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. /********************************************************************* 
  2. *                               槽函數:發送網絡幀 
  3. *參數:cmd:幀命令 
  4. *    frame:發送的報文 
  5. **********************************************************************/  
  6.   
  7. void Net::slot_net_tx_frame(int cmd,QByteArray frame)  
  8. {  
  9.     QByteArray head;  
  10.     int i = 0;  
  11.   
  12.     i = 0;  
  13.     //幀頭  
  14.     head[i++] = 0xc5;  
  15.     head[i++] = 0x5c;  
  16.     //預留  
  17.     head[i++] = 0;  
  18.     head[i++] = 0;  
  19.     //報文長度  
  20.     head[i++] = frame.size() >> 24;  
  21.     head[i++] = frame.size() >> 16;  
  22.     head[i++] = frame.size() >> 8;  
  23.     head[i++] = frame.size();  
  24.     //命令字  
  25.     head[i++] = cmd >> 24;  
  26.     head[i++] = cmd >> 16;  
  27.     head[i++] = cmd >> 8;  
  28.     head[i++] = cmd;  
  29.     //組合幀  
  30.     frame.prepend(head);  
  31.   
  32.     //判斷當前是否鏈接上服務器  
  33.     if (tcp_client->state() == QAbstractSocket::ConnectedState)  
  34.     {  
  35.         //已鏈接上  
  36.         //發送數據  
  37.         tcp_client->write(frame);  
  38.   
  39.     #ifdef DEBUG  
  40.         qDebug() << "發送網絡幀1:cmd" << cmd;  
  41.     #endif  
  42.     }  
  43.     else  
  44.     {  
  45.         //未鏈接上  
  46.         Frame = frame;  
  47.         //鏈接服務器  
  48.         if (tcp_client->state() != QAbstractSocket::ConnectingState)  
  49.         {  
  50.             tcp_client->connectToHost(Server_Ip,Server_Port);  
  51.         }  
  52.     }  
  53. }  


tcp接收網絡幀,並保存爲xml文件,而後讀取xml文件中的信息

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. /********************************************************************* 
  2. *                               接收完成處理 
  3. **********************************************************************/  
  4.   
  5. void Get_Duty::deal_frame()  
  6. {  
  7.     int sum = 0;  
  8.     int i = 0;  
  9.     QSqlQuery q;  
  10.     QString version;  
  11.   
  12.     //解鎖  
  13.     Lock_Net = 0;  
  14.     //放棄處理網絡信息  
  15.     Net_Permission = 0;  
  16.   
  17.     qDebug() << "接收幀:回覆值班信息";  
  18.   
  19.     //判斷是否有值班信息  
  20.     if ((uint8_t)Frame.at(11) == 0)  
  21.     {  
  22.         //有標題,將數據存入xml文件  
  23.         //打開接收命令存儲的xml文件  
  24.         QFile file(FILE_GET_DUTY_RX);  
  25.         //新建文件並保存  
  26.         file.open(QIODevice::WriteOnly);  
  27.         QTextStream out(&file);  
  28.         out.setCodec("UTF-8");  
  29.         out << Frame.mid(LEN_FRAME_HEAD);  
  30.         file.close();  
  31.   
  32.         //打開xml文件  
  33.         QDomDocument doc(FILE_GET_DUTY_RX);  
  34.         //獲取文件內容  
  35.         file.open(QIODevice::ReadOnly);  
  36.         doc.setContent(&file);  
  37.         file.close();  
  38.   
  39.         //得到根節點  
  40.         QDomElement root_node = doc.documentElement();  
  41.         //得到第一個子節點:版本  
  42.         QDomNode node = root_node.firstChild();  
  43.         version = node.toElement().text();  
  44.         //判斷版本號是否一致  
  45.         if (version == Version)  
  46.         {  
  47.             return;  
  48.         }  
  49.   
  50.         //不一致  
  51.         Version = version;  
  52.         qDebug() << "版本號" << Version;  
  53.   
  54.         //下一個子節點:車輛總數  
  55.         node = node.nextSibling();  
  56.         sum = node.toElement().text().toInt();  
  57.         qDebug() << "車輛總數" << sum;  
  58.   
  59.         //清空前3輛車輛信息  
  60.         Car_Three_List[0].clear();  
  61.         Car_Three_List[1].clear();  
  62.         Car_Three_List[2].clear();  
  63.         //清空值班信息表  
  64.         q.prepare("DELETE FROM duty");  
  65.         q.exec();  
  66.         //寫入數據庫  
  67.         for (i = 0;i < sum;i++)  
  68.         {  
  69.             node = node.nextSibling();  
  70.   
  71.             //插入數據  
  72.             q.prepare("INSERT INTO duty VALUES(?,?,?,?,?,?)");  
  73.             //uuid  
  74.             q.bindValue(0,node.toElement().childNodes().at(0).toElement().text());  
  75.             //編號  
  76.             q.bindValue(1,node.toElement().childNodes().at(1).toElement().text().toInt());  
  77.             //車牌  
  78.             q.bindValue(2,node.toElement().childNodes().at(2).toElement().text());  
  79.             //圖片  
  80.             q.bindValue(3,node.toElement().childNodes().at(3).toElement().text());  
  81.             //汽油  
  82.             q.bindValue(4,node.toElement().childNodes().at(4).toElement().text().toInt());  
  83.             //圖片標誌  
  84.             q.bindValue(5,IMG_NULL);  
  85.             q.exec();  
  86.   
  87.             //前3輛車輛信息輸入  
  88.             if (i < 3)  
  89.             {  
  90.                 Car_Three_List[i] = node.toElement().childNodes().at(0).toElement().text();  
  91.             }  
  92.         }  
  93.   
  94.         //打印數據庫  
  95. //        q.prepare("SELECT * FROM duty");  
  96. //        q.exec();  
  97. //        while (q.next())  
  98. //        {  
  99. //            qDebug() << "uuid" << q.value(0).toString()  
  100. //                     << "編號" << q.value(1).toInt()  
  101. //                     << "車牌" << q.value(2).toString()  
  102. //                     << "圖片" << q.value(3).toString()  
  103. //                     << "汽油" << q.value(4).toString()  
  104. //                     << "圖片標誌" << q.value(5).toInt();  
  105. //        }  
  106.     }  
  107.     else  
  108.     {  
  109.         Version = "null";  
  110.   
  111.         //清空值班信息表  
  112.         q.prepare("DELETE FROM duty");  
  113.         q.exec();  
  114.     }  
  115.   
  116.     //接收到值班信息  
  117.     emit sig_recv_duty_info();  
  118.   
  119.     //清空接收緩存  
  120.     Frame.clear();  
  121.     Len_Frame_Content = 0;  

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

相關文章
相關標籤/搜索