C# 如何将值集合分发到动态列表?
我正在开发TCP客户端服务器控制台应用程序。我有N个客户端连接到服务器。在服务器端,我需要共享M条记录,每条记录只应发送一次到客户端。每个记录只能由一个客户接收。 例如,记录数N=4,客户端数M=10,结果应为: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
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处理这种情况。还有一点很好,就是没有客户,我会更新。虽然我喜欢你的解决方案,但仅仅保留一本字典作为一种历史记录是不行的,我的意思是,这不是更简单吗?可能吧,但你仍然需要一遍又一遍地重复整个列表,以确定下一个收件人。