我想知道使用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;
答案 0 :(得分:2)
TCP不支持广播,您必须使用UDP或多播。因此,您唯一的选择是在每次发送内容时遍历Contexts
列表。
肯定会在OnExecute
事件中执行此操作,如果您不介意放慢发送客户端的速度。假设您不想这样做,那么是的,您必须将循环移动到另一个线程。您可以让OnExecute
处理程序将每个接收到的数据块放入一个线程安全的队列中,然后让广播线程从队列中提取数据并根据需要将其发送给连接的客户端。
作为一项附加措施,您还可以为每个客户端提供自己的出站数据线程安全队列,让广播线程(甚至直接OnExecute
)将每个数据块放入每个客户端的队列中,然后让OnExecute
事件将客户端的队列推送到客户端,而不是忙于做其他事情。这样,数据块的广播和发送是并行完成的,因此任何给定的客户端都不会阻止任何其他客户端及时接收数据,因为每个客户端都在自己的线程中运行。