|
|
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги! Продолжая осваивать Indy, у меня возникла еще небольшая проблема... Как я писал в предпредыдущей теме, гоняю запросы через промежуточную службу по схеме Клиент-сужба(1)...служба(n)-служба(с обращением к web-сервису). Для прогона запросов я решил использовать TCP-Client-Server, а также для пересылки кирилицы в кодировке utf-8 дабы не заморачиваться, принял совет использовать TBytes. И вот вроде почти все огонь - запросы перенаправляются, ответы приходят, с кодировкой все в порядке, но как говорится есть нюанс. Если ответ на запрос небольшой, он приходит клиенту целиком, но если ответ становится большим (в ответе только xml), то почему-то при пересылке данные приходят не до конца. Чувствую, что это нубский вопрос, но ответ к сожалению я пока не нашел. Отправляю данные вот так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Проверял полноту ответа в районе службы - там все гуд. Потеря идет где-то именно при передаче данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 14:47 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
dartveider13, данные разбиваются и приходят по кусочкам, что бы отлавливать целые куски - нужно реализовывать пакеты, то есть передаваемые данные предварять например количеством передаваемых байтов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 15:46 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
dartveider13... почему-то при пересылке данные приходят не до конца кто-то не до конца их вычитывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 16:00 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Так как ты отказался от пересылки строк, то ты должен как-то контролировать, всё ли вычиталось и если нет, то читать дальше до конца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:06 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Наводящий вопрос: как клиенту понять, что все данные от сервера прочитаны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:42 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Василий 2Наводящий вопрос: как клиенту понять, что все данные от сервера прочитаны? Передавать общую длину пакета. Или - маркировать пакеты сигнатурами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 18:59 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Вроде же параметр "-1" должен передавать/читать данные из сокета пока в буфере есть данные? Если не так, то получается надо сначала вычитать длину буфера через SizeOf(Buffer)? Про сигнатуры я не знаю, но погуглю в эту сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 05:28 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Если с обеих сторон Read & Write вместо -1 написать Length(Buffer), сокет вываливается с ошибкой 10053. В логах службы пишется что запрос пришел к ней с нулевым размером. Тогда получается, что для Write надо использовать параметр -1, а для Read длину массива? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 06:01 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
А нее.. Я перепутал. Write делается с Length(Buffer), а Read с -1? Сейчас буду пробовать принимать большой пакет))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 06:13 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Неа, все равно не до конца прочитал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 06:27 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Посмотрел длину уходящего и приходящего буфера. Уходящий =5510164, приходящий = 24464 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 06:37 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Пока еще не получается((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 07:54 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
В нескоторых статьях пишется, что сначала отправляется размер, а потом считываются данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 08:14 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Не в курсе про Инди, но есть подозрение, что этот ReadBytes работает как и recv сокета, а значит - читает только то, что есть в буфере сокета на данный момент. То есть цикл вычитки нужного количества данных ложится на программиста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 10:36 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Василий 2, да погоди ты, автор еще не сообразил что сокет из себя представляет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 10:50 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Василий 2, правильно ли я понял, что тогда сначала мне надо послать от сервера клиенту длину массива, а потом в ReadBytes ее указать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 10:50 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгений, ну я так понимаю, что по сокету запросы/ответы гоняются в виде пакетов возможно разной длины. Причем гоняются не сразу а через какой-то промежуток времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 10:52 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
dartveider13, на том уровне, на котором ты работаешь, нет ни запросов, нет ответов, нет пакетов, только последовательности байт, как их интерпретировать - задача которую тебе надо решить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:00 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгений, но если я в методе write указываю количество байт, почему клиент их принимает не весь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:06 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
dartveider13Дегтярев Евгений, но если я в методе write указываю количество байт, почему клиент их принимает не весь? Это ты указываешь на стороне отправщика сколько байт отправить. Сторона приемщика их не получает и она не знает сколько надо получить. Это задача разработчика. Как вариант посылаешь сначала всегда 4 байта - в них лежит размер следующего сообщения. На сторне приемщика сначала принимаешь 4 байта, в них будет лежать сколько байт надо получить. И пачками начинаешь получать ответ до тех пор, пока кол-во полученных байт не станет равно кол-ву переданного в начале. Ну и полученные буферы надо клеить в один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:10 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Примерный псевдокод на коленке Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:18 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
Либо не изобретать велосипед с кубическими колесами и перейти на HTTP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:23 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
X-Cite, с серверной стороны у меня там гуд. Это ответ клиенту длинный. ReadBytes это метод. Он ничего не возвращает. Ну то, что кусочками надо обрабатывать это я понимаю. Пока не могу сообразить как эти кусочки со стороны клиента обработать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:26 |
|
||
|
TCP ReadBytes Indy10
|
|||
|---|---|---|---|
|
#18+
dartveider13X-Cite, с серверной стороны у меня там гуд. Это ответ клиенту длинный. ReadBytes это метод. Он ничего не возвращает. Ну то, что кусочками надо обрабатывать это я понимаю. Пока не могу сообразить как эти кусочки со стороны клиента обработать Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2019, 11:29 |
|
||
|
|

start [/forum/search_topic.php?author=psdpsd&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 700ms |
| total: | 850ms |

| 0 / 0 |
