我正在开发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等)
您能否建议我组织这种流量控制的解决方案?
答案 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);
}
使用此解决方案,m
和n
都可以是动态的。