日期:2014-05-17  浏览次数:21455 次

C# 开发Socket Server,怎么实现百万级用户同时在线?
用ThreadPool.GetMaxThreads的出的最大线程数只有32000多,有办法能同时指出百万级用户吗?能给个思路吗???

------解决方案--------------------
引用:
用ThreadPool.GetMaxThreads的出的最大线程数只有32000多,有办法能同时指出百万级用户吗?能给个思路吗???



。。。。这跟线程没关系的好不。 建立一个新的连接,系统会把这个连接放到一个线程池里。这个我们不用管的。我们要只的是把数据接收到了后 (如开5个线程)分配给某个线程处理后回转给客户端。

你说的百万要是在一台服务器下,就算是C++外加非NB服务硬件也办不到的。 百万级的都是要用到服务器集群来做的。

就是服务器架N台 +N台的网关+中心控制服务器 客户端连接到中心服,由中心服分配通知客户端连接哪个网关走哪个服务器做这个的负载判断。就能达到百万了。

还有如果只是单台的 一个C#开发的服务器可以连接可以达到20000以上的连接,好的机器可以更高些,当然还不算上数据包的收发。如果数据包收发频率高的话每秒2个包 连接数要适当减少。上边的都是TCP模式的。

要是UDP 那可以连接很多坏处就是收发可能会丢包。


------解决方案--------------------
就算百万用户,那么可能大多数时候占用几百个线程来异步处理客户端请求消息就行了。一个消息才会占用一个(由线程池分配的)线程,瞬间、通常只需要几个毫秒就释放回线程池了(消息处理就完成了)。

我知道有些不负责任的人写的博客,给人的所谓的“范例”里,假设有1000个客户端在线,它的服务器程序就要占用1001个线程。你前往不要抄袭这种坑爹的通讯程序例子。
------解决方案--------------------
你前往不要抄袭这种坑爹的通讯程序例子  -->  你千万不要抄袭这种坑爹的通讯程序例子

而且我说这这就是“长连接”的设计。比如说1000个客户端连接服务器8小时,那么就一直连接者并不断开。但是这并不需要占用任何线程。而且假设你有1000用户,就一定有1000个连接的情况(不包括许多用户都没有上线的情况)。

而如果你说的是“短链接”设计,就更没有那种事情了。因为短链接,每一个消息都进行一次“握手”,然后服务器处理消息,然后切断(Shutdown、Close)连接。然后其它的消息再进行重新连接。这个时候更不可能根据所谓的“用户数”来硬说什么“线程数”。

这个数据需要时测。不是想当然的。