0

我正在处理一个 TCP 服务器项目。它异步监听指定端口的连接,接受新连接并开始等待来自它们的数据。每个新客户端在连接时都会发送其 ID,这样我就知道哪个套接字属于哪个客户端。

最少 100000 个客户端将同时连接到服务器。

问题是我应该如何存储这些客户?

class Client
{
    public Socket Socket { get; set; }
    public int ID { get; set; }
}

List<Client>这样的东西肯定会中断,因为List<T>它不是线程安全的类型。我应该在客户端连接到服务器时将其添加到列表中,当连接丢失时将其从列表中删除。例如,我还需要能够向 ID 为 5 的客户端发送消息,并且List<T>在异步环境中迭代 a 是一个糟糕的主意。我认为每次我需要与集合交互时锁定同步根在性能方面没有任何好处。

那么,我应该使用什么来提高性能?

编辑:我使用 .NET 4

4

2 回答 2

3

我会使用一个以 ID 为键的线程安全字典。如果您使用的是 .net 4,则可以使用 System.Collections.Concurrent.ConcurrentDictionary - 如果不是,您可以自己滚动或查看此 url 以获得使用读/写锁的好方法

http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx

于 2012-07-02T12:06:16.190 回答
0

而不是List<Client>你应该使用Dictionary<int, Client>. 通过这种方式,您可以使用单行代码访问任何 id 的客户端,例如

 Dictionary<int, Client> connected = new Dictionary<int, Client>();
 Client cc = connected[5];
 byte[] data = new byte[100]; // any data here
 cc.SendData(data);
于 2012-07-02T12:08:09.003 回答