代码之家  ›  专栏  ›  技术社区  ›  Mike Versteeg

对二进制数据使用tidcmdtcpserver?

  •  0
  • Mike Versteeg  · 技术社区  · 8 年前

    我的windows应用程序中有一个基于 TIdCmdTCPServer 它一直表现很好。现在我有了一个不发送文本字符串而是发送二进制数据的设备。我真的不想重写我的工作代码 TIdTCPServer .

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Remy Lebeau    8 年前

    TIdCmdTCPServer 不会像你所说的那样停止读取NUL字节。默认情况下,它通过调用 TIdIOHandler.ReadLn() ,直到 (CR+)LF 收到。然而, TIdIOHandler.DefStringEncoding 默认设置为us-ascii,因此在将二进制数据作为字符串读取时可能会导致数据丢失。

    尽管如此, tidcmdtcpserver服务器 主要用于文本命令。默认情况下,tt不能接收二进制命令或二进制参数。但是,如果二进制数据遵循文本命令,则 TIdCommandHandler.OnCommand 事件处理程序可以在收到命令后读取二进制数据,只需使用 ASender.Context.Connection.IOHandler 根据需要。

    否则,如果这不适合您的需要(因为二进制命令的格式通常不会触发 OnCommand 事件),则必须从 tidcmdtcpserver服务器 也可以:

    • 覆盖虚拟 ReadCommandLine() 方法从 Connection 并将数据返回到 string 您选择的格式(您可以使用Indy的 IndyTextEncoding_8bit 编码,或 BytesToStringRaw() 功能,帮助你,或者用任何东西 一串 你想要的格式)。然后定义 CommandHandler 以匹配那个字符串化的命令。

    • 覆盖虚拟 DoExecute() 方法,则可以完全控制 连接 并且可以根据需要处理命令。触发器 指挥部 事件,调用服务器的 CommandHandlers.HandleCommand() 传递它的方法 一串 你选择的价值观。

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