Структура сообщения TCP с XML - PullRequest
0 голосов
/ 20 мая 2010

Я отправляю сообщения по 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-) Я должен обращаться с делимером "=" гораздо тщательнее, или мне нужно изменить его параметры.

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

Ответы [ 6 ]

1 голос
/ 21 мая 2010

Просто используйте тот факт, что 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>
1 голос
/ 20 мая 2010

Как насчет этого предложения?

  • заменить "xmlData" на "content"
  • добавить еще один атрибут "contentType"

Затем укажите формат данных с помощью «contentType» и поместите ваши реальные данные в «content». Что касается формата данных (contentType), Base64, учитывая накладные расходы, накладываемые на фактические данные, может быть очень хорошим кандидатом, если ваши данные не слишком длинные.

1 голос
/ 20 мая 2010

Для протоколов TCP действительно существует две школы мысли. Один использует заголовки MIME, как предлагает Vijay. Другой использует двоичные строки с префиксом длины. Строки с префиксом длины обрабатываются намного эффективнее, чем текстовые форматы, и для их устранения не требуется кодирование специальных символов. Недостатком является сервер, с которым вы не можете общаться с помощью клиента Telnet.

1 голос
/ 20 мая 2010

Просто практический ответ на вопрос 2: существует возможность инкапсулировать ваши данные в $ XMLDATA (...) $ EXMLDATA, чтобы вы даже не зависели от XML.

О создании нового протокола, как упомянул Марсело: проверьте существующие: XMLRPC, SOAP

1 голос
/ 20 мая 2010

Вы можете имитировать 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>
1 голос
/ 20 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...