C++ 基于XML的TCP消息结构

C++ 基于XML的TCP消息结构,c++,xml,qt,tcp,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 现在,我还想向消

我通过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
$DKMSG(requestType=REQUEST\u LOGIN&xmlData=
56D
10
40
90
0
20
35
10
sgs3lr
)$EDKMSG
这种方式存在一些问题:

1-)我觉得这不对

2-)我必须更加小心地处理delimeter“=”,否则我需要在参数中更改它


您有什么建议,谢谢。

这看起来像是一种国产格式。您应该使用一些开箱即用的东西,比如JSON、XML、协议缓冲区,甚至是年轻的暴发户:BERT,它甚至指定了使用该格式的RPC协议。这些格式都有用几种语言编写的解析器,它们都是用C++支持的。

这看起来像是一种自生格式。您应该使用一些开箱即用的东西,比如JSON、XML、协议缓冲区,甚至是年轻的暴发户:BERT,它甚至指定了使用该格式的RPC协议。这些格式都有几种语言编写的解析器,它们都是用C++支持的。

可以模仿,它更干净、理解和易于解析:

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>
登录DKMSG/1.0
请求id:123
用户名:metdos
密码:加密
内容类型:text/xml
内容长度:237
56D
10
40
90
0
20
35
10
sgs3lr
您可以模仿,它更清晰、易于理解和解析:

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>
登录DKMSG/1.0
请求id:123
用户名:metdos
密码:加密
内容类型:text/xml
内容长度:237
56D
10
40
90
0
20
35
10
sgs3lr

这只是问题2的一个实用答案:一种可能是将数据封装在$XMLDATA(…)$EXMLDATA中,这样您就不需要依赖XML了


关于制定一个新协议,正如Marcelo所提到的:检查现有协议:XMLRPC、SOAP

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


关于制定一个新协议,正如Marcelo所提到的:检查现有的协议:XMLRPC、SOAP

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

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

这个建议如何

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

然后用“contentType”指定数据格式,并将实际数据放入“content”中。至于数据格式(contentType),考虑到Base64对实际数据的开销,如果您的数据不太长,Base64可能是一个很好的选择。

这个建议怎么样

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

然后用“contentType”指定数据格式,并将实际数据放入“content”中。至于数据格式(contentType),考虑到Base64对实际数据的开销,如果您的数据不是太长的话,Base64可能是一个很好的选择。

只要利用XML是一个树的事实,并且可以重新根目录即可。您希望与原始MXL一起发送的任何信息都可以作为attibutes添加到新的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>

56D
10
40
90
0
20
35
10
sgs3lr

只要利用XML是一棵树的事实,它可以重新根目录。您希望与原始MXL一起发送的任何信息都可以作为attibutes添加到新的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>

56D
10
40
90
0
20
35
10
sgs3lr

如果理解正确,您建议为整个消息发送一个XML文件,并将xmlData用作此XML文件的子文件。事实上,我对XML有病态的厌恶,因此我倾向于使用任何其他格式而不是XML,但是的,这是一般的想法。如果理解正确,您建议为整个消息发送一个XML文件,事实上,我对Xml有一种病态的厌恶,所以我倾向于任何其他格式而不是Xml,但是,是的,这是一个普遍的想法。Ben Voigt:为什么“不利的一面是你不能使用Telnet客户端与服务器对话。”?我真的很困惑。对Ben Voigt说:为什么“缺点是你不能使用Telnet客户端与服务器交谈。”?我真的很困惑。