У меня есть TCP-сервер в моем приложении Windows на основе TIdCmdTCPServer
и это было здорово. Теперь у меня есть устройство, которое не отправляет текстовую строку, но двоичные данные. Я действительно не хочу переписывать мой рабочий код для использования TIdTCPServer
,
Можно ли как-нибудь использовать свой текущий код и получить где-нибудь сброшенные данные, то есть получить доступ к полученным необработанным данным, не мешая другим соединениям, использующим текст?
Я попробовал OnBeforeCommandHandler
событие, но уже кажется, что данные представляют собой строку (т.е. обрезаются в первом нулевом байте).
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
значения по вашему выбору.
Лично я не рекомендовал бы смешивать текстовые и нетекстовые клиенты на одном сервере. Они явно используют разные протоколы, поэтому вы должны использовать разные серверы на разных портах, чтобы обрабатывать их отдельно.
Других решений пока нет …