| 
| 
 | Вопрос # 3 064/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Вопрос по протоколу.
 Как можно разделять наборы данных в передаваемом сообщении? Не в заголовке пакета, а уже непосредственно в данных пакета. Если там строка, то можно было использовать какой-нибудь строковый border. А можно формировать данные так: пишется в поток размер параметра в байтах, затем само значение параметра, размер следующего параметра и т.д...???
 А на принимающей сообщение стороне приводить данные к массиву с элементами типа Variant и затем по типу пакета (в заголовке) все остальное.
 
|  |   Вопрос задал: Roman Novikov (статус: Посетитель)Вопрос отправлен: 4 августа 2009, 14:09
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 22; последнее сообщение — 4 августа 2009, 23:28; участников в обсуждении: 3. Страницы: [1] [2] [Следующая »]  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 14:12 [#1]:Или как можно еще выделить набор байтов типа как вырезать подстроку ограниценную слева и справа чем-то из другой строки? |  
|   | Вадим К (статус: Академик), 4 августа 2009, 14:29 [#2]:опять  начинаем выдумывать? просто пишем размер и дальше сами данные. и всё. Никаких ограничителей и так дальше. простокол TCP/IP гарантирует что данные либо придут, либо будет разрыв связи. Если сильно боимся, что нехороший человек влезит посредине и начнет изменять данные, то просто потом навешиваем ssl и он решает процентов 70 проблем. А остальные... Вы для для ФСБ разрабатываете систему?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 14:50 [#3]:Нееее... не то. Ща пример приведу что нужно. Допустим на стороне сервера выполнили запрос на выборку из базы данных, из таблицы с клиентами, пусть информацией о клиенте будет его фамилия, имя , отчество и возраст в отдельных полях. И в том же запросе пусть еще будет выборка фотки клиента отдельным полем. Нужно передать наборы данных на клиент... как в этом случае данные отправить одним пакетом? - вот в чем суть. Я сначала пишу в поток заголовок, который содержит и общую длину самих данных после заголовка, а потмо данные надо как-то отличать если они не фиксированной длины. На клиенте я считаю весь пакет и часть с данными помещу в поток, далее его надо будет разобрать. Как?
 |  
|   | Вадим К (статус: Академик), 4 августа 2009, 14:54 [#4]:абсолютно не понимаю, в чем проблема. Задача сохранить в сокет ничем особо не отличается от проблемы сохранить в файл. В файл бы это дело сохранили?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 14:57 [#5]:сохранить могу. текстовый файл сформированный по правилам тоже могу.
 нужно из набора байт прочитать параметры, не обязательно текстовые, длина не фиксированная, разделитель пока не придумал... тут не совсем ясно.
 |  
|   | Вадим К (статус: Академик), 4 августа 2009, 15:01 [#6]:вот, если в файл сохранить можете, учитесь читать (если потом прочитать не можете, значити сохранять не можете.). А после того, как отладите сохранение/чтение в файл, просто команды записи\чтения файла заменяются на запись\чтение сокета. и всё. 
 Разделитель. Зачем разделитель??? есть же размер! Или принципиально верите только в свое решение и не видите другого.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 15:02 [#7]:Вот допустим клиенту пришел пакет, он отделил заголовок и данные поместил в TMemoryStream. Теперь у него есть участок памяти,в котором идут подряд Имя, Фамилия, Отчество, Возраст, Картинка набором байт. Что бы вы дальше с этим куском в памяти делали? как разбирали? |  
|   | Вадим К (статус: Академик), 4 августа 2009, 15:06 [#8]:читал бы так, как писал. запись
 Write(length(s), 4);
 write(s[1], length(s));
 
 чтение
 l := ReadInt();
 if (l < 0) or (l > 100000) then raise;
 SetLength(s, l);
 ReadBuf(s[1], l);
 Это набросок. Дальше сами. Картинка - это просто массив байт. и всё.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 15:14 [#9]:А если не знаете как писали? длина же не фиксирована. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 15:16 [#10]:Клиент же знает пока только порядок параметров в присылаемом наборе данных, но не их размер. Мне перед каждым параметром писать в поток его размер или есть другой способ - вот о чем сабж. |  
|   | Вадим К (статус: Академик), 4 августа 2009, 15:21 [#11]:"А если не знаете как писали? длина же не фиксирована." Такого не может быть. В таком случае прочитать данные нельзя. Если пишем строку, то можно конечно в конец строки писать нулевой байт, а потом читать до него. Но с картинкой такой способ уже не применим.
 "Клиент же знает пока только порядок параметров в присылаемом наборе данных, но не их размер. Мне перед каждым параметром писать в поток его размер или есть другой способ - вот о чем сабж."
 Вот я и пишу размер. понятно, что для тех типов, которые имеют фиксированный размер, можно его не писать, но лучше писать.
 А что бы не зависеть от порядка параметров, просто каждому присваиваем номер. 4 байт хватит с головой. и в поток пишем тип, потом размер (это 8 байт уже) и сами данные.
 Клиент прочитав тип, может и сверить рамеры.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 16:02 [#12]:Давайте подведем итог сабжа. Я напишу что получилось, а вы меня проверите, хорошо? 
 Отправляемый пакет будет состоять из двух частей: заголовка и следующего за ним участка с данными.
 Заголовок фиксированной длины 32 байт содержит:
 1) (DWORD 4 байта) Волшебный ключ, идентифицирующий протокол / приложение $FACEFEAD.
 2) (DWORD 4 байта) Версия протокола.
 3) (DWORD 4 байта) Идентификатор пакета.
 4) (DWORD 4 байта) Тип пакета.
 5) (DWORD 4 байта) Размер участка данных в пакетев.
 6) (12 байт) Резерв. Сюда можно поместить LongBool признак шифрования, архивации и прочее.
 Участок с данными формируется следующим образом: (Допустим имеем в результате запроса набор данных, таблицу) берем конкретную строку набора данных и для каждого параметра в поток данных пишем: смысловой тип параметра (DWORD-константа, обозначающая что за параметр - фамилия, возраст...) тип параметра (DWORD-константа, обозначающая тип хранимых данных. Это целое, вещественное, строка...), размер параметра (DWORD-константа, обозначающая размер типа, длину строки), само значение параметра.
 |  
|   | Вадим К (статус: Академик), 4 августа 2009, 16:16 [#13]:А давайте Вы хотя бы за предыдущие вопросы балы проставите, а потом поговорим далее. балы - это стимул экспертов тут работать.. 
 Описанный выше протокол - попытка захватить по максимум.
 ну например я не понимаю, зачем вводить смысловой тип параметра и тип параметра. Это скорее всего будет одно поле. Если фамили, то это строка, если возраст - целое, если пол, то байт. Если так окажеться в будущем, что появиться третий пол (мало чего), то лучше завести новый тип, типа "расширенный пол".
 
 У Вас хоть что то хоть как то рабочее есть?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 16:16 [#14]:Правда смысловой тип и хранимый тип клиент может уже знать по типу пакета(в заголовке)... в протоколе описывается константой. Количество праметров в строке набора данных тоже в зависимости от типа пакета можно определять, в общем читать пока ен прочитаем весь объем данных. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 16:17 [#15]:В смысле? Я разве где-то плохой балл ставил? Сегодня только 5ка была. |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 16:24 [#16]:Хоть что-то... вот переделываю прошлый проект никак не связанный с сетью и тут пытаюсь по кусочкам собрать все недостающее фрагменты знаний для реализации. А так получился же проектик с пересылкой файлов. Разобрал чат по программе на диске к книжке, вот еще скоро доберусь до чата который вы советовали, который авторы выпустили к версии 10.1.5. |  
|   | min@y™ (статус: Доктор наук), 4 августа 2009, 18:02 [#17]:Попробую предложить кое-какую альтернативку. Как-то в глубоком детстве, мы с дружбаном, как многие здесь, писали свой чат для базаров по корпоративной сети.
 Очень долго обдумывали протокол сообщений и в итоге сошлись кодировать параметры сообщений, тексты, картинки, и прочий хлам, который требовалось передавать по сети, в XML.
 Я, конечно, понимаю, что здесь возникает некоторая избыточность данных, зато этот способ оказался очень гибким при добавлении новых полей/параметров/типов сообщений.
 Бинарные данные, как то картинки и прочие файлы, мы кодировали в текст по Base64 и пихали в XML.
 Кроме этого, готовый XML мы шифровали, сжимали BZip'ом и привязывали контрольную сумму для проверки.
 
 Это, конечно, не руководство к действию, однако, подумай, как будет просто и красиво. Главное, здесь не нужно прописывать длину передаваемых частей данных, ибо все данные хранятся в XML как текст.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 4 августа 2009, 18:22 [#18]:xml хорош. я даже когда то писал класс, который может почти любой класс завернуть в хмл, а потом оттудова достать. и что бы передать новые данные, надо было только написать для них класс-контейнер. Мой класс мог сохранять почти всё  - картинки, коллекции, TStringList. Для обычных приложений - выше головы. Более того, он не использовал тяжеловестный майкрософтовский парсер, а свой, самописный. скорость анализа - 3-4 Мб данных в секунду. К сожалению приложить его не могу - это кусок комерческого кода.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 4 августа 2009, 18:51 [#19]:Мы тоже пользовались сторонним парсером. Очень шустро работает и очень просо писать под него код. Называется TECXMLParser. Для него я написал отдельный модуль со вспомогательными функциями. Модуль некоммерческий, могу подарить. Всесте с парсером, он тоже бесплатный и с исходниками. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Roman Novikov (статус: Посетитель), 4 августа 2009, 22:31 [#20]:Будьте добры, растолкуйте что такое парсер и где/как его используют? |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |