【问题标题】:How to reverse connection initiator in IdTCPClient and IdTCPServer having the same functionality?如何在具有相同功能的 IdTCPClient 和 IdTCPServer 中反向连接发起方?
【发布时间】:2016-04-15 04:13:54
【问题描述】:

我想使用 INDY TCP 客户端和服务器组件创建机器间通信。 IdTCPServer 有一个名为 OnExecute 的事件,当客户端想要从服务器获取某些东西时会触发该事件。我想创建相同的功能,当 SERVER 向具有相同 OnExecute 事件的 CLIENT 发送请求时,就像它作为服务器一样工作。是否容易实现?我需要它,因为我只能单向(NAT)连接到对等方

【问题讨论】:

    标签: delphi indy nat


    【解决方案1】:

    IdTCPServer 有一个名为 OnExecute 的事件,当客户端想要从服务器获取某些东西时触发该事件。

    TIdTCPServer.OnExecute 事件不是这样工作的。它在连接的生命周期内连续循环调用,而不管客户端或服务器在连接时间和断开时间之间对连接所做的任何事情。

    事件的典型用法是阻塞调用线程等待客户端发送一个数据包,然后回复一个数据包,然后退出,让循环再次触发事件,所以它可以等待下一个客户端数据包。

    但这不是唯一事件可以使用的方式。

    我想创建相同的功能,当 SERVER 向具有相同 OnExecute 事件的 CLIENT 发送请求时,就像它作为服务器工作一样。是否容易实现?

    TIdTCPClient 本身并没有实现这种逻辑。它只是提供一个连接,但您必须编写自己的代码来告诉它何时通过该连接读取和写入数据。

    根据您的要求,您需要创建自己的工作线程,方法是编写TThread/TIdThread 派生类,或使用TIdThreadComponent 组件。当客户端连接到服务器时,启动线程。当客户端断开连接时,停止线程。然后你的线程可以对连接做任何你想做的事情,就像TIdTCPServer.OnExecute 事件一样。

    根据您的命令/响应的格式,您可能能够使用TIdCmdTCPClient 而不是TIdTCPClientTIdCmdTCPClient 在内部运行自己的线程,其CommandHandlers 集合解析入站请求并生成传出响应。您所要做的就是使用定义每个请求的解析标准的TIdCommandHandler 对象填充集合,并为每个对象分配一个OnCommand 事件处理程序以响应服务器发送的每个请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多