[英]TCP Message Structure with XML
我通过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-)我必须更加小心地处理分号“ =”,否则我需要在参数中进行更改。
您有什么建议,谢谢。
这看起来像是本地格式。 您应该改用开箱即用的东西,例如JSON,XML,协议缓冲区,甚至是新兴的新兴企业:BERT,甚至指定使用该格式的RPC协议。 这些格式都有用多种语言为它们编写的解析器,并且C ++都支持它们。
您可以模仿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的一个实际答案:一种可能是将数据封装在$ XMLDATA(...)$ EXMLDATA中,因此您甚至都不依赖XML。
如Marcelo所述,关于制作新协议:检查现有协议:XMLRPC,SOAP
对于TCP协议,确实有两种思路。 正如Vijay所建议的那样,使用MIME标头。 另一个使用二进制长度前缀的字符串。 带有长度前缀的字符串比文本格式要有效得多,并且不需要编码特殊字符即可消除歧义。 缺点是您无法使用Telnet客户端与之对话的服务器。
这个建议怎么样?
然后,使用“ contentType”指定数据格式,然后将实际数据放入“ content”中。 至于数据格式(contentType),考虑到它给实际数据带来的开销,Base64可能是一个很好的选择,如果您的数据不太长的话。
仅使用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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.