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

C# 如何将值集合分发到动态列表?,c#,.net,sockets,tcpclient,tcpserver,C#,.net,Sockets,Tcpclient,Tcpserver,我正在开发TCP客户端服务器控制台应用程序。我有N个客户端连接到服务器。在服务器端,我需要共享M条记录,每条记录只应发送一次到客户端。每个记录只能由一个客户接收。 例如,记录数N=4,客户端数M=10,结果应为: record1 – to client1 record2 – to client2 record3 – to client3 record4 – to client4 record5 – to client1 record6 – to client2 record7 – to clie

我正在开发TCP客户端服务器控制台应用程序。我有N个客户端连接到服务器。在服务器端,我需要共享M条记录,每条记录只应发送一次到客户端。每个记录只能由一个客户接收。 例如,记录数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,等等)


你能给我一个组织这种流量控制的解决方案吗

您希望循环遍历所有记录,同时循环遍历客户端,但如果
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);
}
var records=GetRecords();//m码
var clients=GetClients();//尺寸n
if(clients.Length==0)
{
//返回或扔到此处,具体取决于您的应用程序
}
对于(var i=0;i

有了这个解决方案,
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);
}
  • 您需要一个列表或集合来保存所有正在连接的客户端。您需要随机访问,即您必须将客户端添加到前端或后端,并且您必须能够随时删除任何元素。如果列表按分配的记录数排序(升序),则可获得奖励点数

  • 当有新记录要处理时(或当您与它们一起迭代列表时):

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

  • 如果客户机断开连接,它将从列表中删除,并重新读取记录以进行重新分发
如果我在考虑这个问题时没有犯任何错误,那么这应该确保任务数最少的客户机中总会有一个获得新记录,除非许多客户机放弃中间处理。在这种情况下,排序列表将是一个优势


当然,还有优化的空间,如果在处理过程中客户数量没有变化(并且只有在开始这样做之前),这不是最好的策略。在这种情况下,您可以简单地使用
i=n%number\u客户机来确定应该处理记录的客户机
n
m>n
没有约束。不管
m
n
的关系如何,只要至少有一个客户机(这将是您在这里丢失的唯一检查)。是的,我不是说它只在
m>n
时才起作用,只是使用mod处理这种情况。还有一点很好,就是没有客户,我会更新。虽然我喜欢你的解决方案,但仅仅保留一本字典作为一种历史记录是不行的,我的意思是,这不是更简单吗?可能吧,但你仍然需要一遍又一遍地重复整个列表,以确定下一个收件人。