powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP ReadBytes Indy10
25 сообщений из 47, страница 1 из 2
TCP ReadBytes Indy10
    #39845407
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые коллеги! Продолжая осваивать 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
TCP ReadBytes Indy10
    #39845439
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,

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

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

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

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

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

Код: 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
TCP ReadBytes Indy10
    #39845760
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо не изобретать велосипед с кубическими колесами и перейти на HTTP
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845762
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, с серверной стороны у меня там гуд. Это ответ клиенту длинный. ReadBytes это метод. Он ничего не возвращает. Ну то, что кусочками надо обрабатывать это я понимаю. Пока не могу сообразить как эти кусочки со стороны клиента обработать
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845763
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
TCP ReadBytes Indy10
    #39845764
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Либо не изобретать велосипед с кубическими колесами и перейти на HTTP
на существующий rpc-like протокол, а что будет в качестве транспорта дело второстепенное
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP ReadBytes Indy10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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