簡體   English   中英

如何將值的集合分配到動態列表?

[英]How to distribute collection of values to dynamic list?

我正在開發TCP客戶端-服務器控制台應用程序。 我有N個客戶端連接到服務器。 在服務器端,我需要共享M條記錄,並且每條記錄僅應發送給客戶端一次。 每條記錄只能由1位客戶接收。 例如,記錄數N = 4,客戶數M = 10,結果應為:

record1 – to client1
record2 – to client2
record3 – to client3
record4 – to client4
record5 – to client1
record6 – to client2
record7 – to client3
record9 – to client4 
record10 – to client5

問題是記錄的數量M是固定的,但客戶端的數量N是固定的(有時N = 3,有時N = 5,等等)

您能否建議我一個組織此類流量控制的解決方案?

我會嘗試實現這樣的事情:

  • 您將需要一個列表或收集所有連接的客戶端。 您將需要隨機訪問,即必須將客戶端添加到前端或后端,並且必須能夠隨時刪除任何元素。 如果列表按分配的記錄數排序(升序),則獎勵積分。

  • 當有新記錄要處理時(或在您使用它們遍歷列表時):

    • 將記錄發送到列表前面的客戶。
    • 從列表的開頭刪除客戶端,然后將其添加到列表的后面(除非對列表進行了排序)。
  • 當新客戶端連接時,它將被添加到列表的前面。

  • 如果客戶端斷開連接,則會將其從列表中刪除,並讀取記錄以進行重新分配。

如果我在考慮這一點時沒有犯任何錯誤,那么這應該確保總是有最少任務數的客戶端之一獲得新記錄,除非許多客戶端放棄中間處理。 在這種情況下,排序列表將是一個優勢。

當然,還有優化的余地,如果您的客戶數量在處理過程中(並且只有在您開始進行更改之前)沒有發生變化,這也不是最佳策略。 在這種情況下,您可以使用i = n % number_of_clients來簡單地確定應該處理記錄n的客戶端。

您想遍歷所有記錄,並同時遍歷客戶端,但是如果m > n ,則可以使用模數來確保遍歷客戶端,如下所示:

var records = GetRecords(); // size m
var clients = GetClients(); // size n

if (clients.Length == 0)
{
    // return or throw here, depending on your application
}

for (var i = 0; i < records.Length; i++)
{
    var record = records[i];
    var client = clients[i%clients.Length];

    SendRecord(record, client);
}

使用此解決方案, mn都可以是動態的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM