如何将值集合分发到动态列表?

时间:2014-02-17 12:30:55

标签: c# .net sockets tcpclient tcpserver

我正在开发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等)

您能否建议我组织这种流量控制的解决方案?

2 个答案:

答案 0 :(得分:1)

我会尝试实现这样的事情:

  • 您需要一个列表或收集所有正在连接的客户端。您需要随机访问,即您必须在前面或后面添加客户端,您必须能够随时删除任何元素。如果列表按指定的记录数量(升序)排序,则为奖励积分。

  • 当有新的记录要处理时(或者当你用它们迭代列表时):

    • 将记录发送到列表前面的客户端。
    • 从列表前面删除客户端并将其添加到后面(除非列表仍然排序)。
  • 当新客户端连接时,它会被添加到列表的前面。

  • 如果客户端断开连接,则会将其从列表中删除,并重新读取记录以进行重新分发。

如果我在考虑这个问题时没有犯任何错误,这应该确保总是一个具有最少任务数量的客户端将获得新记录,除非许多客户端丢弃中间处理。在这种情况下,排序列表将是一个优势。

当然,还有优化的空间,如果您的客户数量在处理过程中没有变化(并且只在您开始这样做之前),那么这不是最好的策略。在这种情况下,您可以使用n简单地确定应该处理记录i = n % number_of_clients的客户端。

答案 1 :(得分: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都可以是动态的。