Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 064

/ вопрос открыт /

Здравствуйте, эксперты!
Вопрос по протоколу.
Как можно разделять наборы данных в передаваемом сообщении? Не в заголовке пакета, а уже непосредственно в данных пакета. Если там строка, то можно было использовать какой-нибудь строковый border. А можно формировать данные так: пишется в поток размер параметра в байтах, затем само значение параметра, размер следующего параметра и т.д...???
А на принимающей сообщение стороне приводить данные к массиву с элементами типа Variant и затем по типу пакета (в заголовке) все остальное.

Roman Novikov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Roman Novikov (статус: Посетитель)
Вопрос отправлен: 4 августа 2009, 14:09
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 22; последнее сообщение — 4 августа 2009, 23:28; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 14:12 [#1]:

Или как можно еще выделить набор байтов типа как вырезать подстроку ограниценную слева и справа чем-то из другой строки?
Вадим К

Вадим К (статус: Академик), 4 августа 2009, 14:29 [#2]:

опять начинаем выдумывать? просто пишем размер и дальше сами данные. и всё. Никаких ограничителей и так дальше. простокол TCP/IP гарантирует что данные либо придут, либо будет разрыв связи.
Если сильно боимся, что нехороший человек влезит посредине и начнет изменять данные, то просто потом навешиваем ssl и он решает процентов 70 проблем. А остальные... Вы для для ФСБ разрабатываете систему?
Галочка "подтверждения прочтения" - вселенское зло.
Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 14:50 [#3]:

Нееее... не то. Ща пример приведу что нужно.
Допустим на стороне сервера выполнили запрос на выборку из базы данных, из таблицы с клиентами, пусть информацией о клиенте будет его фамилия, имя , отчество и возраст в отдельных полях. И в том же запросе пусть еще будет выборка фотки клиента отдельным полем. Нужно передать наборы данных на клиент... как в этом случае данные отправить одним пакетом? - вот в чем суть. Я сначала пишу в поток заголовок, который содержит и общую длину самих данных после заголовка, а потмо данные надо как-то отличать если они не фиксированной длины. На клиенте я считаю весь пакет и часть с данными помещу в поток, далее его надо будет разобрать. Как?
Вадим К

Вадим К (статус: Академик), 4 августа 2009, 14:54 [#4]:

абсолютно не понимаю, в чем проблема. Задача сохранить в сокет ничем особо не отличается от проблемы сохранить в файл.
В файл бы это дело сохранили?
Галочка "подтверждения прочтения" - вселенское зло.
Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 14:57 [#5]:

сохранить могу.
текстовый файл сформированный по правилам тоже могу.
нужно из набора байт прочитать параметры, не обязательно текстовые, длина не фиксированная, разделитель пока не придумал... тут не совсем ясно.
Вадим К

Вадим К (статус: Академик), 4 августа 2009, 15:01 [#6]:

вот, если в файл сохранить можете, учитесь читать (если потом прочитать не можете, значити сохранять не можете.). А после того, как отладите сохранение/чтение в файл, просто команды записи\чтения файла заменяются на запись\чтение сокета. и всё.

Разделитель. Зачем разделитель??? есть же размер! Или принципиально верите только в свое решение и не видите другого.
Галочка "подтверждения прочтения" - вселенское зло.
Roman Novikov

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

Roman Novikov (статус: Посетитель), 4 августа 2009, 15:14 [#9]:

А если не знаете как писали? длина же не фиксирована.
Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 15:16 [#10]:

Клиент же знает пока только порядок параметров в присылаемом наборе данных, но не их размер. Мне перед каждым параметром писать в поток его размер или есть другой способ - вот о чем сабж.
Вадим К

Вадим К (статус: Академик), 4 августа 2009, 15:21 [#11]:

"А если не знаете как писали? длина же не фиксирована." Такого не может быть. В таком случае прочитать данные нельзя.
Если пишем строку, то можно конечно в конец строки писать нулевой байт, а потом читать до него. Но с картинкой такой способ уже не применим.
"Клиент же знает пока только порядок параметров в присылаемом наборе данных, но не их размер. Мне перед каждым параметром писать в поток его размер или есть другой способ - вот о чем сабж."
Вот я и пишу размер. понятно, что для тех типов, которые имеют фиксированный размер, можно его не писать, но лучше писать.
А что бы не зависеть от порядка параметров, просто каждому присваиваем номер. 4 байт хватит с головой. и в поток пишем тип, потом размер (это 8 байт уже) и сами данные.
Клиент прочитав тип, может и сверить рамеры.
Галочка "подтверждения прочтения" - вселенское зло.
Roman Novikov

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

Roman Novikov (статус: Посетитель), 4 августа 2009, 16:16 [#14]:

Правда смысловой тип и хранимый тип клиент может уже знать по типу пакета(в заголовке)... в протоколе описывается константой. Количество праметров в строке набора данных тоже в зависимости от типа пакета можно определять, в общем читать пока ен прочитаем весь объем данных.
Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 16:17 [#15]:

В смысле? Я разве где-то плохой балл ставил? Сегодня только 5ка была.
Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 16:24 [#16]:

Хоть что-то... вот переделываю прошлый проект никак не связанный с сетью и тут пытаюсь по кусочкам собрать все недостающее фрагменты знаний для реализации. А так получился же проектик с пересылкой файлов. Разобрал чат по программе на диске к книжке, вот еще скоро доберусь до чата который вы советовали, который авторы выпустили к версии 10.1.5.
min@y™

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™

min@y™ (статус: Доктор наук), 4 августа 2009, 18:51 [#19]:

Мы тоже пользовались сторонним парсером. Очень шустро работает и очень просо писать под него код. Называется TECXMLParser. Для него я написал отдельный модуль со вспомогательными функциями. Модуль некоммерческий, могу подарить. Всесте с парсером, он тоже бесплатный и с исходниками.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Roman Novikov

Roman Novikov (статус: Посетитель), 4 августа 2009, 22:31 [#20]:

Будьте добры, растолкуйте что такое парсер и где/как его используют?

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:31
Выполнено за 0.03 сек.