2010-05-20 2 views
0

Я отправляю сообщения по TCP/IP, а с другой стороны разбираю TCP-сообщение. Например, это одно из отправленных сообщений.Структура TCP-сообщений с XML

$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-) Я должен обрабатывать делиметр «=» с гораздо большей осторожностью или мне нужно изменить его в параметрах.

Каковы ваши предложения, спасибо.

ответ

1

Это похоже на доморощенный формат. Вместо этого вы должны использовать что-то «из коробки», например, JSON, XML, буферы протоколов или даже молодые выскочки: BERT, который даже определяет протокол RPC, который использует формат. В этих форматах все парсеры написаны для них на нескольких языках, и все они поддерживаются на C++.

+0

Если вы правильно понимаете, вы предлагаете отправить XML-файл для всего сообщения и использовать xmlData в качестве дочернего элемента этого Xml-файла. – metdos

+0

На самом деле, у меня есть патологическое отвращение к XML, поэтому я бы одобрил любой из других форматов по XML, но да, это общая идея. –

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, действительно есть две школы мысли. Один использует заголовки MIME, как было предложено Виджаем. Другой использует бинарные длины с префиксом. Строки с префиксом длины намного эффективнее обрабатывать, чем текстовые форматы, и не требуют кодирования специальных символов для устранения неоднозначности. Недостатком является сервер, с которым вы не можете разговаривать с помощью клиента Telnet.

+0

Ben Voigt: почему «Недостатком является сервер, с которым вы не можете разговаривать с помощью клиента Telnet»? Я действительно смущен. – Brent81

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>