powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP ReadBytes Indy10
22 сообщений из 47, страница 2 из 2
TCP ReadBytes Indy10
    #39845768
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, а на сервере не надо тогда отправку тоже в цикл заворачивать, если мы кусочками по 100 байт шлем?
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845771
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
100 байт - это пример. В данном случае все сообщение....
Можно и 100 Мб отправить одним Write
Кусочками только принимаем...
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845772
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, Получается вместо 100 на сервере я указываю свою длину массива байтов. Читаю ее клиентом и в цикле складываю его по кусочкам?
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845774
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,
Я думаю в indy есть метод типа Client.ReadAll(Buf, sz); который будет ждать и читать сам внутри до тех пор пока не получит размер sz
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845775
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда код на клиенте свернется до
Код: pascal
1.
2.
sz := Client.Read(4);
Client.ReadAll(Buf, sz);



Кстати на сервере надо делать также...
Где гарантия что переданные вами 10 байт, по дороге не разобьются на 2 части и не придут двумя сообщениями в 4 и 6 байт...
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845777
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, ну да согласен. Сейчас будем копать...
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845784
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, попробовал сделать так:
Сервер:
Код: pascal
1.
2.
Acontext.Connections.Socket.Write(Length(Buffer), True); // Передает размер
Acontext.Connection.Socket.Write(Buffer, Length(Buffer), 0);



Клиент:
Код: pascal
1.
2.
sz := IdTCPClient.Socket.ReadInt64();
IdTcpClient.Socket.ReadBytes(Buffer, sz, False);



Сваливается в Connection Closed Gracefully. В Буфере на сервере 3653 длина, а в sz приходит аж 1010792557... Чет то много
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845788
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Socket.Write(Length(Buffer), True); - сколько байт вы передаете здесь.
IdTCPClient.Socket.ReadInt64(); - столько байт надо читать здесь.
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845793
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, здесь нельзя указать количество байт
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845796
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев ЕвгенийВасилий 2Либо не изобретать велосипед с кубическими колесами и перейти на HTTP
на существующий rpc-like протокол, а что будет в качестве транспорта дело второстепенное
Не совсем. В HTTP есть уже все приколы с длиной ответа, поточность, если вдруг понадобится, стандартизация. Учитывая уровень знаний ТС, намного легче взять уже готовое и на его основе с небольшими доработками сваять нужный функционал
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845797
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2, да как то осталась только часть с получением ответа. Не хотелось бы из-за этого полностью менять подход.
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845804
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот вопрос решился. Немного надо будет конечно обработать всякие исключения, но получилось примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Сервер
Socket.WriteLn(IntToStr(Length(Buffer))) // отправляем размер буфера
Socket.Write(Buffer, Length(Buffer), 0); // отправляем сам буфер

// На клиенте
sz := StrToInt(Socket.Readln()); // получили размер
Socket.ReadBytes(Buffer, sz, false) // получили буфер

// дальше его обработка



Спасибо всем за участе. Отдельное спасибо XCite
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845817
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно учитывать, что метод Readln не выбрасывает исключение при ошибке таймаута, а возвращает пустую строку (хотя возможно разное поведение в разных версиях Indy10).
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845820
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также нежелательно передавать большой объём данных одним блоком. Должно быть ограничение, например максимум 5 МБ. При приёме также желательно контролировать объём данных, принимаемых с клиента и если InputSize больше 5 МБ, то это может быть атакой на сервер из чужого ПО, в этом случае дочитываем буфер и рвём связь.
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845822
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer, там не такие большие пакетики. В них XML-на.
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845826
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13
Код: pascal
1.
2.
3.
Socket.WriteLn(IntToStr(Length(Buffer))) // отправляем размер буфера

sz := StrToInt(Socket.Readln()); // получили размер



все будет хорошо
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845912
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений, ну это ответ на коленке. В реалии я конечно же оборачиваю все это дело в проверки и try
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845959
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы ты пересылал строки, то инди бы само разбиралось с передачей. Ну а массивы байт придётся дополнительно обрабатывать
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39845964
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,

if string(flag) == "true"
вспомнилось
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39846021
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13X-Cite, здесь нельзя указать количество байт

Код: pascal
1.
2.
3.
Socket.Write(Int32(Length(Buffer))); // передаем 4 байта т.к. есть метод procedure Write(AValue: Int32; AConvert: Boolean = True); overload;

sz := IdTCPClient1.Socket.ReadInt32() // читаем 4 байта



ну или так тоже можно
Код: pascal
1.
2.
Socket.Write(ToBytes(Length(Bytes)), 4); // передаем 4 байта
sz := Socket.ReadInt32() // читаем 4 байта


А то какие-то извращения со строками.
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39847277
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, о спасибо. Действительно извращение со строками
...
Рейтинг: 0 / 0
TCP ReadBytes Indy10
    #39847280
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да неужели
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP ReadBytes Indy10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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