Использовать TIdCmdTCPServer для двоичных данных?

У меня есть TCP-сервер в моем приложении Windows на основе TIdCmdTCPServer и это было здорово. Теперь у меня есть устройство, которое не отправляет текстовую строку, но двоичные данные. Я действительно не хочу переписывать мой рабочий код для использования TIdTCPServer,

Можно ли как-нибудь использовать свой текущий код и получить где-нибудь сброшенные данные, то есть получить доступ к полученным необработанным данным, не мешая другим соединениям, использующим текст?

Я попробовал OnBeforeCommandHandler событие, но уже кажется, что данные представляют собой строку (т.е. обрезаются в первом нулевом байте).

0

Решение

TIdCmdTCPServer не прекращает читать ноль байтов, как вы утверждаете. По умолчанию он читает каждую команду, вызывая TIdIOHandler.ReadLn(), который читает до (CR+)LF получено. Тем не менее TIdIOHandler.DefStringEncoding по умолчанию установлен US-ASCII, что может привести к потере данных при чтении двоичных данных в виде строки.

Что, как говорится, TIdCmdTCPServer предназначен в первую очередь для текстовых команд. По умолчанию tt не может принимать двоичные команды или двоичные параметры. Однако, если двоичные данные следуют за текстовой командой, ваш TIdCommandHandler.OnCommand обработчики событий могут читать двоичные данные после получения команды, просто читая двоичный файл, используя ASender.Context.Connection.IOHandler по мере необходимости.

В противном случае, если это не соответствует вашим потребностям (потому что двоичные команды не в формате, который обычно вызывает OnCommand событие), вам придется вывести новый класс из TIdCmdTCPServer и имейте это либо:

  • переопределить виртуальный ReadCommandLine() метод для чтения двоичной команды и ее параметров из Connection и вернуть эти данные в string формат по вашему выбору (вы можете использовать Indy’s IndyTextEncoding_8bit кодировка или BytesToStringRaw() функция, чтобы помочь вам с этим, или использовать что-либо string формат вы хотите). А затем определить CommandHandler чтобы соответствовать этой строковой команде.

  • переопределить виртуальный DoExecute() метод, то у вас есть полный контроль над чтением Connection и может обрабатывать команды, как вы хотите. Для запуска OnCommand события, вызов сервера CommandHandlers.HandleCommand() метод передачи его string значения по вашему выбору.

Лично я не рекомендовал бы смешивать текстовые и нетекстовые клиенты на одном сервере. Они явно используют разные протоколы, поэтому вы должны использовать разные серверы на разных портах, чтобы обрабатывать их отдельно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]