Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP ReadBytes Indy10 / 25 сообщений из 47, страница 1 из 2
05.08.2019, 14:47
    #39845407
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Уважаемые коллеги! Продолжая осваивать Indy, у меня возникла еще небольшая проблема... Как я писал в предпредыдущей теме, гоняю запросы через промежуточную службу по схеме Клиент-сужба(1)...служба(n)-служба(с обращением к web-сервису).
Для прогона запросов я решил использовать TCP-Client-Server, а также для пересылки кирилицы в кодировке utf-8 дабы не заморачиваться, принял совет использовать TBytes.
И вот вроде почти все огонь - запросы перенаправляются, ответы приходят, с кодировкой все в порядке, но как говорится есть нюанс. Если ответ на запрос небольшой, он приходит клиенту целиком, но если ответ становится большим (в ответе только xml), то почему-то при пересылке данные приходят не до конца. Чувствую, что это нубский вопрос, но ответ к сожалению я пока не нашел.
Отправляю данные вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
// Клиент
// Отправка запроса
IdTCPClient.Socket.Write(Buffer, -1, 0);
// Получение ответа
IdTCPClient.Socket.ReadBytes(Buffer, -1, False);

// На стороне сервера отправка ответа
AContext.Connection.Socket.Write(Buffer, -1, 0);



Проверял полноту ответа в районе службы - там все гуд. Потеря идет где-то именно при передаче данных.
...
Рейтинг: 0 / 0
05.08.2019, 15:46
    #39845439
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
dartveider13,

данные разбиваются и приходят по кусочкам, что бы отлавливать целые куски - нужно реализовывать пакеты, то есть передаваемые данные предварять например количеством передаваемых байтов
...
Рейтинг: 0 / 0
05.08.2019, 16:00
    #39845450
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
dartveider13... почему-то при пересылке данные приходят не до конца
кто-то не до конца их вычитывает
...
Рейтинг: 0 / 0
05.08.2019, 17:06
    #39845477
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Так как ты отказался от пересылки строк, то ты должен как-то контролировать, всё ли вычиталось и если нет, то читать дальше до конца.
...
Рейтинг: 0 / 0
05.08.2019, 17:42
    #39845515
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Наводящий вопрос: как клиенту понять, что все данные от сервера прочитаны?
...
Рейтинг: 0 / 0
05.08.2019, 18:59
    #39845548
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Василий 2Наводящий вопрос: как клиенту понять, что все данные от сервера прочитаны?

Передавать общую длину пакета. Или - маркировать пакеты сигнатурами.
...
Рейтинг: 0 / 0
06.08.2019, 05:28
    #39845640
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Вроде же параметр "-1" должен передавать/читать данные из сокета пока в буфере есть данные? Если не так, то получается надо сначала вычитать длину буфера через SizeOf(Buffer)?
Про сигнатуры я не знаю, но погуглю в эту сторону.
...
Рейтинг: 0 / 0
06.08.2019, 06:01
    #39845642
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Если с обеих сторон Read & Write вместо -1 написать Length(Buffer), сокет вываливается с ошибкой 10053. В логах службы пишется что запрос пришел к ней с нулевым размером. Тогда получается, что для Write надо использовать параметр -1, а для Read длину массива?
...
Рейтинг: 0 / 0
06.08.2019, 06:13
    #39845644
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
А нее.. Я перепутал. Write делается с Length(Buffer), а Read с -1? Сейчас буду пробовать принимать большой пакет)))
...
Рейтинг: 0 / 0
06.08.2019, 06:27
    #39845646
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Неа, все равно не до конца прочитал
...
Рейтинг: 0 / 0
06.08.2019, 06:37
    #39845647
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Посмотрел длину уходящего и приходящего буфера. Уходящий =5510164, приходящий = 24464
...
Рейтинг: 0 / 0
06.08.2019, 07:54
    #39845651
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Пока еще не получается(((
...
Рейтинг: 0 / 0
06.08.2019, 08:14
    #39845653
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
В нескоторых статьях пишется, что сначала отправляется размер, а потом считываются данные
...
Рейтинг: 0 / 0
06.08.2019, 10:36
    #39845720
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Не в курсе про Инди, но есть подозрение, что этот ReadBytes работает как и recv сокета, а значит - читает только то, что есть в буфере сокета на данный момент. То есть цикл вычитки нужного количества данных ложится на программиста
...
Рейтинг: 0 / 0
06.08.2019, 10:50
    #39845733
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Василий 2,

да погоди ты, автор еще не сообразил что сокет из себя представляет
...
Рейтинг: 0 / 0
06.08.2019, 10:50
    #39845734
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Василий 2, правильно ли я понял, что тогда сначала мне надо послать от сервера клиенту длину массива, а потом в ReadBytes ее указать?
...
Рейтинг: 0 / 0
06.08.2019, 10:52
    #39845736
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Дегтярев Евгений, ну я так понимаю, что по сокету запросы/ответы гоняются в виде пакетов возможно разной длины. Причем гоняются не сразу а через какой-то промежуток времени
...
Рейтинг: 0 / 0
06.08.2019, 11:00
    #39845744
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
dartveider13,

на том уровне, на котором ты работаешь, нет ни запросов, нет ответов, нет пакетов, только последовательности байт, как их интерпретировать - задача которую тебе надо решить
...
Рейтинг: 0 / 0
06.08.2019, 11:06
    #39845750
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Дегтярев Евгений, но если я в методе write указываю количество байт, почему клиент их принимает не весь?
...
Рейтинг: 0 / 0
06.08.2019, 11:10
    #39845752
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
dartveider13Дегтярев Евгений, но если я в методе write указываю количество байт, почему клиент их принимает не весь?
Это ты указываешь на стороне отправщика сколько байт отправить.
Сторона приемщика их не получает и она не знает сколько надо получить. Это задача разработчика.

Как вариант посылаешь сначала всегда 4 байта - в них лежит размер следующего сообщения.
На сторне приемщика сначала принимаешь 4 байта, в них будет лежать сколько байт надо получить.
И пачками начинаешь получать ответ до тех пор, пока кол-во полученных байт не станет равно кол-ву переданного в начале.
Ну и полученные буферы надо клеить в один.
...
Рейтинг: 0 / 0
06.08.2019, 11:18
    #39845756
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Примерный псевдокод на коленке

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Client.Write(100, 4); // значение 100 в 4 байта
Client.Write(Buffer, 100); // буфер размером в 100 байт


bs := TBytesStream.Create;
sz := Server.Read(4); // читаем 4 байта
repeat
  szreal := Server.Read(Buf, sz - bs.size); // пытаемся прочитать столько байт, сколько еще не приняли
  bs.Write(Buf, szreal);
until bs.size >= sz // если суммарно прочитано меньше чем надо - еще раз читаем
...
Рейтинг: 0 / 0
06.08.2019, 11:23
    #39845760
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Либо не изобретать велосипед с кубическими колесами и перейти на HTTP
...
Рейтинг: 0 / 0
06.08.2019, 11:26
    #39845762
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
X-Cite, с серверной стороны у меня там гуд. Это ответ клиенту длинный. ReadBytes это метод. Он ничего не возвращает. Ну то, что кусочками надо обрабатывать это я понимаю. Пока не могу сообразить как эти кусочки со стороны клиента обработать
...
Рейтинг: 0 / 0
06.08.2019, 11:29
    #39845763
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
dartveider13X-Cite, с серверной стороны у меня там гуд. Это ответ клиенту длинный. ReadBytes это метод. Он ничего не возвращает. Ну то, что кусочками надо обрабатывать это я понимаю. Пока не могу сообразить как эти кусочки со стороны клиента обработать

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Server.Write(100, 4); // значение 100 в 4 байта
Server.Write(Buffer, 100); // буфер размером в 100 байт


bs := TBytesStream.Create;
sz := Client.Read(4); // читаем 4 байта
repeat
  szreal := Client.Read(Buf, sz - bs.size); // пытаемся прочитать столько байт, сколько еще не приняли
  bs.Write(Buf, szreal);
until bs.size >= sz // если суммарно прочитано меньше чем надо - еще раз читаем
...
Рейтинг: 0 / 0
06.08.2019, 11:30
    #39845764
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP ReadBytes Indy10
Василий 2Либо не изобретать велосипед с кубическими колесами и перейти на HTTP
на существующий rpc-like протокол, а что будет в качестве транспорта дело второстепенное
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP ReadBytes Indy10 / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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