Гость
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Сетевой обмен. Парсинг информации на лету / 10 сообщений из 10, страница 1 из 1
12.12.2021, 06:43
    #40119378
FreeAdman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
Всем привет!

Парни, подскажите, пожалуйста такой момент.

Для примера возьмём простой сокет и обычный HTTP протокол.
Соединяемся с сервером, отправляем данные и получаем ответ от сервера.

Вот какой вопрос... А как происходит парсинг данных в таком случае когда размер заголовков неизвестен?
Ведь для разделения заголовков и данных нужно отловить два перевода строки #13#13.

И вот предположим маленькая скорость, ну пусть 1 байт в секунду, и что - каждую секунду парсить буфер на #13#13 чтобы узнать где конец заголовков? Да как-то не оптимально и дурно...

А если речь о XML? Клиент скачивает, например, какие-то данные или параметры в XML формате, как отловить начало и конец тега <data></data> для парсинга не зная размер данных ?
...
Рейтинг: 0 / 0
12.12.2021, 08:51
    #40119381
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
FreeAdman,

Не путай транспортный и информационный протоколы.
Если в сокете есть данные, то они есть целиком.
...
Рейтинг: 0 / 0
12.12.2021, 09:34
    #40119385
FreeAdman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
Соколинский Борис,
Что за чушь? Вы видимо не поняли вопроса да и не хотите.
В сокете те данные которые пришли, но вам же не понять что данные кусками приходят, а не ЦЕЛИКОМ.
...
Рейтинг: 0 / 0
12.12.2021, 11:01
    #40119391
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
Все верно кроме того что надо с начала парсить каждый раз. Парси только свеже полученное.
...
Рейтинг: 0 / 0
12.12.2021, 12:15
    #40119400
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
FreeAdman

А если речь о XML? Клиент скачивает, например, какие-то данные или параметры в XML формате, как отловить начало и конец тега <data></data> для парсинга не зная размер данных ?

Xml - парсеру не нужно никаких заголовков. Он будет ждать завершающегося тега.

Но в твоём вопросе столько всего намешано. Если ты на сыром сокетном протоколе хочешь стримить
множество документов - то надо будет ввести еще один слой абстракций. Что-то вроде месседжа. И разделить
стрим месседжей от внутреннего содеоржимого который тоже может быть InputStream но при этом делать
close после того как документ распаршен до конца.
...
Рейтинг: 0 / 0
12.12.2021, 12:27
    #40119401
FreeAdman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
Dima T
Все верно кроме того что надо с начала парсить каждый раз. Парси только свеже полученное.

Мне пора на свалку. Я об этом не подумал :(

mayton
Xml - парсеру не нужно никаких заголовков. Он будет ждать завершающегося тега

т.е. ему перенаправить поток и он сам разберется? ))
...
Рейтинг: 0 / 0
12.12.2021, 14:01
    #40119412
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
FreeAdman,

Обычно применяется State Machine (автомат состояний).
Каждый кусок считанный из сокета переводит автомат в новое состояние (или не изменяет состояние).
В самом простейшем случае, состояние это просто весь предыдущий текст из сокета, как из вашего примера с HTTP, где каждый раз про добавлении нового куска данных все парсится заново.
Но конечно есть более оптимальные реализации.
Например можно вдобавок хранить на каком состоянии и позиции оборвался предыдущий парсинг и продолжить парсинг прямо с того же места.
...
Рейтинг: 0 / 0
12.12.2021, 15:18
    #40119419
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
FreeAdman
Dima T
Все верно кроме того что надо с начала парсить каждый раз. Парси только свеже полученное.

Мне пора на свалку. Я об этом не подумал :(

mayton
Xml - парсеру не нужно никаких заголовков. Он будет ждать завершающегося тега

т.е. ему перенаправить поток и он сам разберется? ))

Да. Ниакакая длина потока ему не нужна. Длина - это вообще артефакт http-протокола
который может поддерживаться а может и нет. Для динамического содержимого этот
параметр вообще неизвестен на момент формирования хедера респонса.
...
Рейтинг: 0 / 0
13.12.2021, 08:11
    #40119551
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
FreeAdman,

Вариантов с HTTP несколько:
1) если в полученных данных первый стмвол "G", тогда читаем до тех пор пока не встретится два переноса строк. Как только пришла новая порция данных, проверяем что там, если опять не найден конец пакета, возвращаемся на чтение. Как разработчик сервера, ты можешь ограничиться неким таймаутом, поэтому плохих или медленных клиентов сбрасывать,в том числе не передающих вообще данных.

2) если первый символ "P", тогда ищем текст Content-Length:, читаем до конца строки число, ищем опять же две пустые строки и считаем размер в байтах после этих символов и ждём до тех пор, пока не наберётся не меньше указанного в заголовке.
Если же размер пакета не передали, то значит ищем 2 конца строки - далее идут данные, читаем их до тех пор, пока сокет не отключился. Как клиент отключился, значит данные дошли. Такой вариант тоже есть (вообще с серверной стороны про это почитать ещё надо, с клиентской так и работает, при скачивании файлов, когда заранее неизвестен его размер)
...
Рейтинг: 0 / 0
13.12.2021, 10:35
    #40119575
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой обмен. Парсинг информации на лету
VSVLAD, "Неправильно ты, дядя Фёдор, бутерброд ешь".

P.S.
Прежде, чем раздавать вредные советы, полезно почитать спецификацию. Про диапазоны, chunked и вот это вот всё.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Сетевой обмен. Парсинг информации на лету / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]