Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Установка TCP-сервера с поддержкой передачи строковых данных в формате hex

Delphi , Интернет и Сети , TCP/IP

В статье будет рассмотрен вопрос о том, как установить TCP-сервер для приёма строковых данных в формате hex, используя Delphi и компоненты Indy. В частности, мы столкнемся с задачей обработки запросов от клиентов, которые отправляют данные в виде пакетов фиксированного размера 1099 байт, начинающихся с 00D0 и заканчивающихся 00000000.

Шаг 1: Настройка TCP-сервера

Для начала работы нам нужно создать новое Delphi-проект и добавить на форму компонент Indy TIdTCPServer. В свойствах сервера укажем порт, который будет слушать (например, 8080).

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
    // Основной код обработки запросов
end;

Шаг 2: Получение данных от клиента

Когда сервер получает данные, нам нужно прочитать их в буфер. Indy предоставляет удобный метод ReadBytes, который позволяет сделать это.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
    data: TIdBytes;
begin
    SetLength(data, 1099);
    AContext.Connection.IOHandler.ReadBytes(data, Length(data), False);
end;

Шаг 3: Обработка пакетов

Проблема пользователя заключалась в том, что сервер получал данные размером 1099 байт, но сообщение об ошибке "invalid Frame" появлялось постоянно. Проблема была связана с тем, как обрабатывались начальный и конечный маркеры пакетов.

Использование функции BytesToString из модуля IdGlobal позволит нам преобразовать полученные байты в строку для последующей проверки:

RStr := BytesToString(data);

Однако, важно отметить, что индексация строки начинается с 1 (если не используется директива { $ZEROBASEDSTRINGS OFF }). Следовательно, при извлечении подстроки необходимо учитывать это:

if TextStartsWith(RStr, '00D0') and TextEndsWith(RStr, '00000000') then
begin
    // Пакет валиден, обработка данных
end
else
begin
    // Пакет невалиден, ошибка
end;

Пользовательский запрос к copy также должен учитывать это:

copy(RStr, 1092, 8)

Шаг 4: Исправление ошибки

Согласно обсуждению и подсказке от пользователя @RemyLebeau, если входные данные представлены в виде байтов, то для чтения пакетов лучше использовать метод ReadBytes без их преобразования в строку. Также необходимо убедиться, что все операции с UI элементами выполняются в главном потоке.

Шаг 5: Изменение алгоритма приема данных

В случае, если данные идут непрерывно, серверу нужно будет "дождаться" начала пакета с маркером 00D0:

var
    b: Byte;
begin
    b := AContext.Connection.IOHandler.ReadByte;
    repeat
        if b <> $00 then Exit; // Пропуск немаркированных байтов
        b := AContext.Connection.IOHandler.ReadByte;
    until b = $D0; // Ждем начала пакета

    // Далее читаем данные пакета размером 1097 байт (учитываем маркеры)
    SetLength(data, 1097);
    AContext.Connection.IOHandler.ReadBytes(data, Length(data), True);
end;

После получения данных проверяем их на валидность:

if ((PWord(@data[0])^ = $D000) and (data[1] = $D0)) and
   (PUInt32(@data[1091])^ = $00000000) then
begin
    // Валидный пакет, обработка данных
end else
begin
    // Пакет неверен, игнорировать данные и продолжать чтение
    AContext.Connection.IOHandler.ReadBytes(data, Length(data), False);
end;

Заключение

В данной статье был рассмотрен процесс настройки TCP-сервера для приема строковых данных в формате hex с использованием компонентов Indy в Delphi. Мы обсудили основные шаги по настройке сервера, чтению и обработке пакетов, а также исправили ошибки, связанные с неправильной обработкой начальных и конечных маркеров пакетов.

Использование методов BytesToString, TextStartsWith и TextEndsWith из модуля IdGlobal облегчает работу со строками, но важно понимать особенности работы с индексацией строк в Delphi. При работе с байтовыми данными предпочтительнее использовать методы чтения без их преобразования.

Обработка данных в многопоточной среде требует особого внимания к тому, как обращаться к UI-контролам из рабочего потока сервера. Правильное использование TThread.Queue обеспечивает безопасность доступа к элементам интерфейса пользователя.


Статья предназначена для специалистов в области компьютерных наук, работающих с Delphi и Pascal, и может служить полезным руководством при настройке TCP-сервера для работы со строковыми данными в формате hex.

Создано по материалам из источника по ссылке.

Статья посвящена процессу установки TCP-сервера в среде Delphi с использованием компонентов Indy для приема строковых данных в формате Hex, обрабатываемых как пакеты фиксированного размера.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TCP/IP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-12 07:20:43/0.0036830902099609/0