繁体   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