【问题标题】:Delphi and TIdTCPServer.OnExecute: How to correctly merge dataDelphi 和 TIdTCPServer.OnExecute:如何正确合并数据
【发布时间】:2012-03-27 10:10:46
【问题描述】:

一个非常简单的问题,我似乎找不到明确的答案。

我有一个经典的 TCP Indy 服务器。我分块发送数据。每个数据包以 1 个或多个块的形式发送。当它到达时,每个数据包都会触发一次或多次 OnExecute。不止一个客户端可以在任何给定时间发送数据。我如何知道我在 OnExecute 中为哪个客户端/数据包接收数据?我知道这可能是一个微不足道的问题,但我想得到一个明确的答案。

【问题讨论】:

  • 这里是delphigeist.com/2010/09/… 的一种方法示例,请注意,这是一项“匆忙”的工作,您可以改进很多,但这只是一个开始。
  • 为什么要分块发送数据?这正是 TCP 为您做的事情?您不必关心这些低级问题。
  • 如果 TCP 为我这样做,我也会遇到同样的问题。 OnExecute 被触发不止一次。另外,如果您要发送一个非常大的文件怎么办。您是否只需将其加载到单个块中即可。不可取。将数据分成可管理的块总是好的。
  • @Smasher 我不同意你的观点,如果你想发送大文件,比如 4 GB 并且连接因任何原因而中断,你是重新开始,还是从最后一个成功的数据包继续?
  • @Smasher,为什么这是矫枉过正。块可以是 1MB 大,所以你有同样的情况。数据以一个块发送,但如果它更大,则以更多块发送。谁说块必须非常小。我所看到的只是这种方法的优点,没有真正的缺点。如果这样做,您基本上没有开销,因此您关于过度杀伤力的论点是无效的。

标签: delphi tcp indy


【解决方案1】:

如果你可以设计协议,可以这样做:

  • 客户端从包含总大小和块大小的初始命令开始
  • 服务器 OnExecute 创建一个临时输出文件流并将文件信息存储在上下文中
  • 客户端发送块
  • 服务器 OnExecute 读取块(使用已知块长度的 Indy TCP 服务器阻塞读取方法)并将它们附加到输出流中

Indy TCP 上下文类可以扩展为客户端连接添加自定义信息。

【讨论】:

  • 啊,这是我缺少的扩展上下文类。因此,我可以将客户端 ID 或数据 ID 添加到上下文中,这样我就知道在另一端将什么重新组合在一起。我似乎不清楚。
  • @Runner 上下文类仅在服务器端(参见 TIdCustomTCPServer)。它绑定到客户端连接(参见 TIdContext.Connection),并且可以使用 TIdCustomTCPServer.ContextClass 注册一个子类:= TMyContextClass;
  • 如果您不想派生新类,也可以使用TIdContext.Data 属性。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2015-01-13
相关资源
最近更新 更多