使用TIdCmdTCPServer获取二进制数据?

时间:2018-06-15 10:19:25

标签: c++ c++builder indy indy10

我的Windows应用程序中有一个基于TIdCmdTCPServer的TCP服务器,它的性能非常好。现在我有一个不发送文本字符串但是二进制数据的设备。我真的不想重写我的工作代码来使用TIdTCPServer

有什么方法可以使用我当前的代码并在某处获取丢弃的数据,即我是否可以访问接收到的原始数据而不会干扰使用文本的其他连接?

我尝试了OnBeforeCommandHandler事件,但它似乎已经假设数据是一个字符串(即在第一个零字节处切断)。

1 个答案:

答案 0 :(得分:1)

TIdCmdTCPServer不会像你声称的那样停止读取nul字节。默认情况下,它通过调用TIdIOHandler.ReadLn()读取每个命令,该命令读取直到收到(CR+)LF。但是,默认情况下TIdIOHandler.DefStringEncoding设置为US-ASCII,因此在将二进制数据作为字符串读取时可能会导致数据丢失。

话虽如此,TIdCmdTCPServer主要是为文本命令设计的。默认情况下,tt无法接收二进制命令或二进制参数。但是,如果二进制数据遵循文本命令,那么您的TIdCommandHandler.OnCommand事件处理程序可以在收到命令后读取二进制数据,只需根据需要使用ASender.Context.Connection.IOHandler读取二进制数据。

否则,如果这不符合您的需求(因为二进制命令的格式通常不会触发OnCommand事件),您必须从TIdCmdTCPServer派生一个新类,拥有它:

  • 覆盖虚拟ReadCommandLine()方法,从Connection读取二进制命令及其参数,并以您选择的string格式返回该数据(您可以使用Indy& #39; s IndyTextEncoding_8bit编码或BytesToStringRaw()功能可以帮助您,或使用您想要的任何string格式。然后定义CommandHandler以匹配该字符串化命令。

  • 覆盖虚拟DoExecute()方法,然后您可以完全控制Connection的读取,并可以根据需要处理命令。要触发OnCommand个事件,请调用服务器的CommandHandlers.HandleCommand()方法,并将其string个值传递给您。

就个人而言,我不建议在同一台服务器上混合使用文本和非文本客户端。它们显然使用不同的协议,因此您应该在不同的端口上使用不同的服务器来单独处理它们。