2014-02-17 38 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