【问题标题】:Delphi - Can indy TIdTCPClient Send/Receive large streams at the same timeDelphi - 可以 indy TIdTCPClient 同时发送/接收大流
【发布时间】:2015-12-28 18:32:36
【问题描述】:

是否可以通过 TIdTCPServer/TIdTCPClient 与同一个客户端同时发送/接收大流。

我在客户端创建了一个线程来处理传入的请求。

客户端收到请求,但在前一个请求完成(发送或接收)之前不会将其发送回服务器。

【问题讨论】:

  • 没有看到 MCVE,就不可能知道代码出了什么问题。单个线程一次只能处理一个请求。如果要同时处理多个请求,则需要多个线程,可能需要一个线程池。这也与服务器无关,服务器甚至可能不是 Indy,甚至可能不在 Delphi 中。这只是您关心的客户端。
  • @JerryDodge 每个请求由一个单独的线程处理。
  • 那么回到我的第一句话,我们看不到您是如何编写代码的,因此我们无法回答您的问题。提供一个 MCVE 来证明您的问题,我们可以解决这个问题。

标签: delphi indy


【解决方案1】:

是否可以同时使用 TIdTCPServer/TIdTCPClient 与同一个客户端发送/接收大流。

是的,这是可能的。但是如何你这样做取决于你的协议实现。 TCP 套接字是双向和全双工的。您可以让一个线程发送而另一个线程正在接收。或者你可以将你的流分解成块,这样一个线程就可以发送一个块、读取一个块、发送一个块、读取一个块等。

我在客户端创建了一个线程来处理传入的请求。

客户端收到请求,但在前一个请求完成(发送或接收)之前不会将其发送回服务器。

这意味着您在单个线程中进行处理,并以串行方式一次处理一个请求,在这种情况下,您不会从连接中读取下一个请求,直到首先发送前一个响应.虽然这是典型模型,但它可能不是正确模型,具体取决于您的特定需求。

【讨论】:

  • 他可以在同一个端口上进行发送和恢复吗?
  • @remy-lebeau 如果主 TIdTCPClient 仍在发送,您是否建议创建 array of TIdTCPClient 来处理每个新请求?或者它是一个糟糕的实现。如果你推荐的话。服务器是否也应该使用 array of TIdTCPServer ?我知道 tcpserver 是多线程的,但我的意思是,如果同一个客户端使用多个 TIdTCPClient 连接到同一个服务器,那么服务器仍然可以在每个 TIdTCPClient 的单独线程上与该客户端一起工作,我很感激你的回答。
  • 同样,这取决于您的特定协议设计。如果服务器允许来自同一客户端 PC 的多个连接,那很好,但请注意,您将使用更多服务器资源,因此其他客户端无法使用它们。但绝对不要使用服务器阵列。就像你自己说的,TIdTCPServer 是多线程的。每个TIdTCPClient 连接都将是一个新线程,因此您可以使用单个服务器。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多