2013-12-12 71 views
0

我想知道使用Indy 10 TidTCPServer處理「一對多」通信的好方法,即從客戶端接收流,並立即將此數據寫入所有連接「觀衆」。這裏的要點是數據的來源來自客戶端(而不是服務器)。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

你是如何使用LockList的?請顯示一些代碼。什麼類型的數據?你已經有聯繫了嗎? –

回答

1

TCP不支持廣播,你必須爲此使用UDP或多播。因此,您唯一的選擇是在每次發送內容時循環顯示Contexts列表。

可以肯定會在OnExecute事件,如果你不介意放慢發送客戶端。假設你不想這樣做,那麼是的,你必須將循環移到另一個線程。您可以讓OnExecute處理程序將每個接收到的數據塊放入線程安全隊列,然後讓廣播線程從隊列中提取數據並根據需要將其發送給連接的客戶端。作爲一項附加措施,您還可以爲每個客戶端分配出站數據的單獨線程安全隊列,讓廣播線程(甚至直接將每個數據塊放入每個客戶端隊列中),然後使用OnExecute事件在客戶不忙的時候將客戶的隊列推送給客戶。這樣,數據塊的廣播和發送是並行完成的,因此任何給定的客戶端都不會阻止任何其他客戶端及時接收數據,因爲每個客戶端都在其自己的線程中運行。

+0

謝謝雷米! – user3096642

相關問題