如何在具有相同功能的IdTCPClient和IdTCPServer中反转连接启动器?

时间:2016-04-14 18:28:51

标签: delphi indy nat

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

1 个答案:

答案 0 :(得分:1)

  

IdTCPServer有一个名为OnExecute的事件,当客户端需要来自服务器的内容时​​会触发该事件。

这不是TIdTCPServer.OnExecute事件的工作原理。无论客户端或服务器连接的时间与断开连接的时间之间的连接如何,都会在连接的生命周期内连续循环调用它。

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

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

  

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

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

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

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

相关问题