|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
Всем привет! Парни, подскажите, пожалуйста такой момент. Для примера возьмём простой сокет и обычный HTTP протокол. Соединяемся с сервером, отправляем данные и получаем ответ от сервера. Вот какой вопрос... А как происходит парсинг данных в таком случае когда размер заголовков неизвестен? Ведь для разделения заголовков и данных нужно отловить два перевода строки #13#13. И вот предположим маленькая скорость, ну пусть 1 байт в секунду, и что - каждую секунду парсить буфер на #13#13 чтобы узнать где конец заголовков? Да как-то не оптимально и дурно... А если речь о XML? Клиент скачивает, например, какие-то данные или параметры в XML формате, как отловить начало и конец тега <data></data> для парсинга не зная размер данных ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 06:43 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
FreeAdman, Не путай транспортный и информационный протоколы. Если в сокете есть данные, то они есть целиком. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 08:51 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
Соколинский Борис, Что за чушь? Вы видимо не поняли вопроса да и не хотите. В сокете те данные которые пришли, но вам же не понять что данные кусками приходят, а не ЦЕЛИКОМ. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 09:34 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
Все верно кроме того что надо с начала парсить каждый раз. Парси только свеже полученное. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 11:01 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
FreeAdman А если речь о XML? Клиент скачивает, например, какие-то данные или параметры в XML формате, как отловить начало и конец тега <data></data> для парсинга не зная размер данных ? Xml - парсеру не нужно никаких заголовков. Он будет ждать завершающегося тега. Но в твоём вопросе столько всего намешано. Если ты на сыром сокетном протоколе хочешь стримить множество документов - то надо будет ввести еще один слой абстракций. Что-то вроде месседжа. И разделить стрим месседжей от внутреннего содеоржимого который тоже может быть InputStream но при этом делать close после того как документ распаршен до конца. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 12:15 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
Dima T Все верно кроме того что надо с начала парсить каждый раз. Парси только свеже полученное. Мне пора на свалку. Я об этом не подумал :( mayton Xml - парсеру не нужно никаких заголовков. Он будет ждать завершающегося тега т.е. ему перенаправить поток и он сам разберется? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 12:27 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
FreeAdman, Обычно применяется State Machine (автомат состояний). Каждый кусок считанный из сокета переводит автомат в новое состояние (или не изменяет состояние). В самом простейшем случае, состояние это просто весь предыдущий текст из сокета, как из вашего примера с HTTP, где каждый раз про добавлении нового куска данных все парсится заново. Но конечно есть более оптимальные реализации. Например можно вдобавок хранить на каком состоянии и позиции оборвался предыдущий парсинг и продолжить парсинг прямо с того же места. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 14:01 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
FreeAdman Dima T Все верно кроме того что надо с начала парсить каждый раз. Парси только свеже полученное. Мне пора на свалку. Я об этом не подумал :( mayton Xml - парсеру не нужно никаких заголовков. Он будет ждать завершающегося тега т.е. ему перенаправить поток и он сам разберется? )) Да. Ниакакая длина потока ему не нужна. Длина - это вообще артефакт http-протокола который может поддерживаться а может и нет. Для динамического содержимого этот параметр вообще неизвестен на момент формирования хедера респонса. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2021, 15:18 |
|
Сетевой обмен. Парсинг информации на лету
|
|||
---|---|---|---|
#18+
FreeAdman, Вариантов с HTTP несколько: 1) если в полученных данных первый стмвол "G", тогда читаем до тех пор пока не встретится два переноса строк. Как только пришла новая порция данных, проверяем что там, если опять не найден конец пакета, возвращаемся на чтение. Как разработчик сервера, ты можешь ограничиться неким таймаутом, поэтому плохих или медленных клиентов сбрасывать,в том числе не передающих вообще данных. 2) если первый символ "P", тогда ищем текст Content-Length:, читаем до конца строки число, ищем опять же две пустые строки и считаем размер в байтах после этих символов и ждём до тех пор, пока не наберётся не меньше указанного в заголовке. Если же размер пакета не передали, то значит ищем 2 конца строки - далее идут данные, читаем их до тех пор, пока сокет не отключился. Как клиент отключился, значит данные дошли. Такой вариант тоже есть (вообще с серверной стороны про это почитать ещё надо, с клиентской так и работает, при скачивании файлов, когда заранее неизвестен его размер) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 08:11 |
|
|
start [/forum/topic.php?fid=16&msg=40119381&tid=1339607]: |
0ms |
get settings: |
29ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
299ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 422ms |
0 / 0 |