C# 服务器体系结构

C# 服务器体系结构,c#,.net,sockets,C#,.net,Sockets,希望有两个与创建服务器应用程序相关的简单问题: 可同时打开的插座数量是否有理论/实践限制?忽略数据到达后处理数据所需的资源!如果相关的话,我的目标是.net框架 每个连接应该在一个永久分配给它的独立线程中运行,还是应该使用线程池?专用线程方法似乎更简单,但一次运行100多个线程似乎很奇怪。这种做法是否可以接受 非常感谢您的任何建议 Ventasu正如我所记得的(很久以前就有套接字了),实现它们的最好方法是使用ReceiveAsync(.NET 3.5)/BeginReceive方法,使用异步

希望有两个与创建服务器应用程序相关的简单问题:

  • 可同时打开的插座数量是否有理论/实践限制?忽略数据到达后处理数据所需的资源!如果相关的话,我的目标是.net框架
  • 每个连接应该在一个永久分配给它的独立线程中运行,还是应该使用线程池?专用线程方法似乎更简单,但一次运行100多个线程似乎很奇怪。这种做法是否可以接受
非常感谢您的任何建议
Ventasu

正如我所记得的(很久以前就有套接字了),实现它们的最好方法是使用ReceiveAsync(.NET 3.5)/BeginReceive方法,使用异步回调,这将利用线程池。不要为每个连接打开一个线程,这是对资源的浪费。

确实存在实际限制。但是,您很可能在到达负载之前很久就耗尽了处理负载的资源。CPU或内存在连接数之前更可能耗尽

为了获得最大的可伸缩性,您不希望每个连接都有一个单独的线程,而是希望使用一个异步模型,该模型仅在服务活动(如接收或发送数据)连接时使用线程。

您可能会发现该模型很有用。它演示了如何使用.NET线程池和异步套接字方法(beginacept/EndAccept和BeginReceive/EndReceive)编写可伸缩的TCP服务器


尽管如此,当您可以使用众多WCF绑定之一(甚至可以编写自定义绑定)并从WCF基础设施的全部功能中获益时,编写自己的服务器很少是一个好主意。它的可扩展性可能比每台自定义编写的服务器都好。

假设您希望多人同时连接,那么每个连接至少需要一个线程。您能否在有限数量的线程上依次循环使用套接字,其中一个线程专用于接收传入请求?这是一种可能性,但是,如果您有长时间运行的连接,您肯定会面临队列很长的风险。当我说“线程”时,我真正的意思是“异步接收和发送数据的方法”,所以线程池或异步套接字也可以工作。感谢这提供了一个与我所想的模式类似的模式,因为我已经在使用begin/end accept。这完美地解决了我的需要!虽然我很感激提到wcf,但不幸的是只有服务器是.net。客户端是android应用程序,这意味着带宽很紧。此外,连接始终处于打开状态(这是一个简单的多人游戏),其中wcf是基于http/soap的?虽然与原始套接字相比,我喜欢wcf的简单性,但在这种情况下,我认为我别无选择。希望我对wcf没有错误的假设@不,你对WCF的假设是错误的。它不仅限于基于HTTP/SOAP的。您可以通过TCP使用二进制绑定。它们可能不太具有互操作性,但如果愿意,您可以编写自定义绑定并使用任何协议。这是非常可定制的,这就是它的力量。您还可以使用REST或POX over HTTP,这可能比SOAP更优化。因此,如果我对你有一个建议的话,那就是:如果你打算在.NET平台上托管服务器,就使用WCF。我对带宽的另一个担忧是HTTP头(由于许多小消息而加剧),但是如果HTTP是可以避免的,那就不是问题。我是个傻瓜,不理会好的建议!谢谢你纠正我,我会调查一下。我发现WCF对长时间运行的TCP连接不起作用。它会遇到各种各样的任意长度问题,通常是一种后遗症。您会遇到奇怪的超时,然后在一定数量的连接后(即使更改了默认限制),它也不会重新连接。这就像一些内部资源被检查了,你必须重新启动。