【问题标题】:Transferring Data Directly between 2 Connections in Indy (TIdContext)在 Indy (TIdContext) 中的 2 个连接之间直接传输数据
【发布时间】:2011-07-09 09:29:17
【问题描述】:

我有一个运行 TIdTCPServer 的服务器,客户端使用 Web 浏览器(或任何其他软件)进行通信,我不知道协议,但我想做的是在客户端和另一个连接(都连接到相同的 TIdTCPServer)例如第一个客户端发送的数据被传输到第二个客户端,第二个客户端发送的数据被传输到第一个客户端,就像代理一样(我不能真正使用代理服务器,因为它只是这个条件)并且 TIdTCPServer 应该仍在接收其他客户端并处理它们的数据。

我偶然发现了第一行代码,因为 TIdContext.Connection.Socket.ReadLn 需要一个分隔符,并且服务器不知道客户端的协议。

有什么想法吗?

谢谢。

【问题讨论】:

  • 也许 Indy 中的 TIdMappedPortTCP 组件会有所帮助,但需要进行一些修改 - 请参阅 stackoverflow.com/questions/4136226/proxy-server-using-indy
  • 当遇到同样的问题时,我使用了ICS - The Internet Component Suite 组件:与 Indy 不同,它们不会阻塞,因此您可以轻松地同时接收和发送。
  • 我不能使用 TIedMppedPortTCP 因为它实际上是一个服务器,有很多功能,提供信息和东西,而这只是服务器内部的一个功能,可以将客户端带到另一个客户端,我不能移动到ICS 因为我在做跨平台开发:(

标签: delphi sockets delphi-7 indy10


【解决方案1】:

您可以查看TIdMappedPortTCPTIdHTTPProxyServer 的源代码,了解它们如何在两个方向的连接之间传递任意数据。两个组件都使用TIdSocketList.SelectReadList() 来检测任一连接何时有数据要读取。 TIdMappedPortTCP 然后使用TIdBuffer.ExtractToBytes()TIdIOHandler.Write(TIdBytes),而TIdHTTPProxyServer 使用TIdTCPStreamTIdBuffer.ExtractToStream()

【讨论】:

  • 这非常非常复杂,因为我以前从未真正看过 Indy Source,即使我这样做了,我也不认为我能够让我的新代码跨平台。
  • Indy 是一个跨平台的库。我所描述的适用于所有平台。在多个 TIdContext 对象之间传输数据的方式有很多种,具体取决于您实际需要传输的内容。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多