我通过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-)我必须更加谨慎地处理定界符“=”,或者我需要在参数中更改它。
你有什么建议,谢谢。
答案 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)
这个建议怎么样?
然后使用“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>