使用XML的TCP消息结构

时间:2010-05-20 11:36:21

标签: c++ xml qt tcp

我通过TCP / IP发送消息,另一方面我解析TCP消息。例如,这是发送消息之一。

$DKMSG(requestType=REQUEST_LOGIN&requestId=123&username=metdos&password=123)$EDKMSG

澄清:

$DKMSG(       //Start
)$EDKMSG      //End
requestType   //Parameter
REQUEST_LOGIN //Parameter Value

现在我还想在我的消息中添加一个Xml文件。我正在考虑这个选项:

$DKMSG(requestType=REQUEST_LOGIN&xmlData=
 <Item id="56D@MIT" type="SIGNAL">
 <Label>
 <Text>56D</Text>
 <X1>10</X1>
 <Y1>40</Y1>
 <RotateAngle>90</RotateAngle>
 </Label>
 <X1>0</X1>
 <Y1>20</Y1>
 <Width>35</Width>
 <Height>10</Height>
 <Source>sgs3lr</Source>
</Item>
)$EDKMSG

这种方式存在问题:

1-)这对我来说似乎不对。

2-)我必须更加谨慎地处理定界符“=”,或者我需要在参数中更改它。

你有什么建议,谢谢。

6 个答案:

答案 0 :(得分:1)

这看起来像是一种本土格式。您应该使用开箱即用的东西,比如JSON,XML,协议缓冲区,甚至年轻的新贵:BERT,它甚至指定使用该格式的RPC协议。这些格式都有以多种语言为它们编写的解析器,并且它们都在C ++上受支持。

答案 1 :(得分:1)

你可以模仿HTTP,它更清晰,易于理解且易于解析:

LOGIN DKMSG/1.0
request-id: 123
username: metdos
password: eNcrYpTED
content-type: text/xml
content-length: 237

<Item id="56D@MIT" type="SIGNAL">
 <Label>
 <Text>56D</Text>
 <X1>10</X1>
 <Y1>40</Y1>
 <RotateAngle>90</RotateAngle>
 </Label>
 <X1>0</X1>
 <Y1>20</Y1>
 <Width>35</Width>
 <Height>10</Height>
 <Source>sgs3lr</Source>
</Item>

答案 2 :(得分:1)

关于问题2的一个实际答案:可能是将您的数据封装在$ XMLDATA(...)$ EXMLDATA中,因此您甚至不依赖于XML。

关于制定新协议,如Marcelo所述:检查现有协议:XMLRPC,SOAP

答案 3 :(得分:1)

对于TCP协议,确实有两种思想流派。一个使用MIME标头,如Vijay所建议的那样。另一个使用二进制长度前缀字符串。长度前缀字符串比文本格式更有效,并且不需要编码特殊字符来消除歧义。缺点是使用Telnet客户端无法与之通信的服务器。

答案 4 :(得分:1)

这个建议怎么样?

  • 将“xmlData”替换为“content”
  • 添加另一个属性“contentType”

然后使用“contentType”指定您的数据格式,并将您的真实数据放在“内容”中。至于数据格式(contentType),考虑到它对实际数据施加的开销,Base64可能是一个非常好的候选者,如果你的数据不是太长。

答案 5 :(得分:1)

只使用XML是树的事实,并且可以重新植根。您希望与原始MXL一起发送的任何信息都可以作为新XML根目录添加。

<DKMSG requestType="REQUEST_LOGIN">
     <Item id="56D@MIT" type="SIGNAL">
     <Label>
     <Text>56D</Text>
     <X1>10</X1>
     <Y1>40</Y1>
     <RotateAngle>90</RotateAngle>
     </Label>
     <X1>0</X1>
     <Y1>20</Y1>
     <Width>35</Width>
     <Height>10</Height>
     <Source>sgs3lr</Source>
    </Item>
</DKMSG>