【问题标题】:Indy 10 / TidTCPServer / Streaming from one client to manyIndy 10 / TidTCPServer / 从一个客户端流式传输到多个客户端
【发布时间】:2013-12-12 18:52:45
【问题描述】:

我想知道一种使用 Indy 10 TidTCPServer 处理“一对多”通信的好方法,即从客户端接收流,并立即将此数据写入所有连接的“查看器”。这里的重点是数据的来源来自客户端(而不是服务器)。

在 OnExecute 过程中,我无法从那里写入其他连接的客户端,使用 LockList 只会冻结当前线程,因此无济于事...

我应该使用不同的线程来处理缓冲区交换吗?

缓冲区数据主要是字节,客户端已经连接,比如说3(#1发送,#2和#3应该接收)

这是我的 OnExecute 过程中的内容:

var
lst: Tlist;

[­..]

  lst := idTcpServer1.Contexts.LockList;

  try
    for i := 1 to lst.Count-1 do
    begin
      try
        TIdContext(lst.Items[i]).Connection.IOHandler.Write('Test');
      except
      end;
    end;
  finally
    idTcpServer1.Contexts.UnlockList;
  end;

【问题讨论】:

  • 你是如何使用 LockList 的?请显示一些代码。什么类型的数据?你已经有连接了吗?

标签: delphi tcp indy indy10


【解决方案1】:

TCP 不支持广播,你必须使用 UDP 或 Multicast。所以你唯一的选择是每次你有东西要发送时循环遍历Contexts列表。

如果您不介意放慢发送客户端的速度,您可以当然可以在 OnExecute 事件中这样做。假设您不想这样做,那么是的,您必须将循环移动到另一个线程。您可以让OnExecute 处理程序将每个接收到的数据块放入线程安全队列中,然后让广播线程从队列中提取数据并根据需要将其发送到连接的客户端。

作为一项附加措施,您还可以为每个客户端提供其自己的出站数据线程安全队列,让广播线程(甚至直接OnExecute)将每个数据块放入每个客户端的队列中,然后让OnExecute 事件在不忙于做其他事情时将客户端的队列推送到客户端。这样,数据块的广播和发送是并行完成的,因此任何给定的客户端都不会阻止任何其他客户端及时接收数据,因为每个客户端都在自己的线程中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多