2010-05-20 94 views
0

我正在通過TCP/IP發送消息,另一方面我解析了TCP消息。例如,這是發送的消息之一。使用XML的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="[email protected]" 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-)我必須非常小心地處理delimeter「=」,或者我需要在參數中更改它。

你有什麼建議,謝謝。

回答

1

這看起來像一個本土的格式。你應該使用一些開箱即用的東西,比如JSON,XML,協議緩衝區,甚至是年輕的新貴:BERT,它甚至指定了使用這種格式的RPC協議。這些格式都有以多種語言爲他們編寫的解析器,並且它們都在C++上受支持。

+0

如果理解正確,則建議發送整個消息的XML文件,並使用xmlData作爲此Xml文件的子項。 – metdos 2010-05-20 11:44:02

+0

實際上,我對XML有一種病態的反感,所以我會贊成任何其他格式的XML,但是,是的,這是一般的想法。 – 2010-05-20 22:20:01

1

你可以模仿HTTP,這是清潔的,很好理解並且易於解析:

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

<Item id="[email protected]" 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> 
1

只是問題2實際的答案:一個可能性是封裝在$ XMLDATA數據(...) $ EXMLDATA,所以你甚至不依賴於XML。

關於製作一個新的協議,由馬塞洛提到:檢查現有的:XMLRPC,SOAP

1

對於TCP協議,真的有兩個思想流派。正如Vijay所建議的那樣,使用MIME頭文件。另一個使用二進制長度前綴的字符串。長度前綴字符串比文本格式處理效率高得多,並且不需要編碼特殊字符來消除歧義。缺點是您無法使用Telnet客戶端進行通信的服務器。

+0

對於本Voigt:爲什麼「缺點是你不能使用Telnet客戶端談話的服務器。」?我很困惑。 – Brent81 2010-05-20 13:47:57

1

這個建議怎麼樣?

  • 替換「XMLDATA」與「內容」
  • 添加另一個屬性「的contentType」

然後用「的contentType」指定的數據格式,並把你的真實數據「內容」。至於數據格式(contentType),考慮到它對實際數據施加的開銷,Base64可能是一個很好的候選者,如果你的數據不是太長的話。

1

只需使用XML是一棵樹,並且可以重新植根的事實。您希望與原始MXL一起發送的任何信息都可以添加爲新XML根目錄的屬性。

<DKMSG requestType="REQUEST_LOGIN"> 
    <Item id="[email protected]" 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>