2014-02-17 40 views
0

我正在開發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等)

能否請您提供一個解決方案來組織這種類型的流量控制?

回答

1

我想嘗試實現這樣的:

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

  • 當有一個新的記錄過程(或您遍歷與他們的列表):

    • 發送記錄到客戶端列表的前面之中。
    • 從列表的前面刪除客戶端並將其添加到後面(除非列表依然排序)。
  • 當新客戶端連接時,它會添加到列表的前面。

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

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

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

+0

雖然我喜歡你的解決方案,但是不僅僅是將字典保存爲一個歷史記錄,而不是簡單的工作。 –

+0

可能,但您仍然需要反覆遍歷整個列表以確定下一個收件人。 – Mario

0

您可以通過所有記錄要循環,同時通過客戶的循環,但使用模量,以確保您回送用戶通過客戶端如果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可能都充滿活力。

+0

只是想補充一點,'m> n'沒有限制。只要至少有一個客戶端(這將是您唯一缺少的檢查項),它將以任何方式工作,無論「m」如何與'n'相關。 – Mario

+0

是的,我不是說它只會在'm> n'時才起作用,只是使用mod來處理這種情況。關於沒有客戶的好消息,病態更新 – Alden