В данной статье рассматривается задача разработки пользовательского протокола на основе TCP/IP, используя компоненты Indy. Основное внимание уделяется вопросу отправки и приема записей (headers) вместе с файлами через потоковый интерфейс. Примером такой записи может служить заголовок, который указывает на то, что за ним следует изображение определенного размера.
Проблема
Разработчик столкнулся с необходимостью отправки записей (record) по протоколу TCP/IP, где одна из записей содержит информацию о том, что за ней следуют данные изображения. На стороне сервера задача заключается в разделении пришедших данных на заголовок и само изображение.
Решение
Для решения этой задачи важно корректно сериализовать данные перед их отправкой через сеть. В частности, строки должны быть закодированы и отправлены вместе с указанием их длины, что особенно актуально для поддержки Delphi 2009+ в связи с переходом на Unicode.
procedure WriteStrToIO(IO: TIdIOHandler; const S: String);
var
Buf: TIdBytes;
Len: Integer;
begin
Buf := ToBytes(S, IndyUTF8Encoding);
Len := Length(Buf);
IO.Write(Len);
if Len > 0 then IO.Write(Buf);
end;
var
Len: Integer;
Buf: TIdBytes; // или любой другой тип данных...
begin
if Client.Connected then
begin
WriteStrToIO(Client.IOHandler, 'Adrian');
Buf := ...; // дополнительные данные
Len := Length(Buf);
Client.IOHandler.Write(Len);
if Len > 0 then
Client.IOHandler.Write(Buf);
...
end;
end;
var
NameStr: String;
Buf: TIdBytes;
begin
with AContext.Connection.IOHandler do
begin
NameStr := ReadString(ReadInteger, IndyUTF8Encoding);
// чтение дополнительных данных...
ReadBytes(Buf, ReadInteger);
end;
// ShowMessage() не является потокобезопасным!
Windows.MessageBox(0, PChar(NameStr), 'NameStr', MB_OK);
end;
Обработка событий OnExecute
Событие OnExecute вызывается многократно и это нормальное поведение. Оно предназначено для постоянного чтения входящих сообщений, пока клиент подключен.
Выводы
Для разработки надежного пользовательского протокола важно правильно сериализовать данные перед их отправкой, а также корректно обрабатывать прием данных на стороне сервера. Indy предоставляет необходимые средства для реализации таких задач.
Примечание: В данной статье представлены основные моменты разработки пользовательского протокола с использованием Indy. Для более глубокого понимания и детальной настройки рекомендуется обратиться к документации Indy и изучить примеры реализации сетевых приложений.
Разработка пользовательского протокола для разделения заголовков от данных изображения в TCP-клиенте с использованием компонентов Indy.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.