socket编程中处理多个(上万个)客户端问题

footman2046 2010-07-27 11:18:04
近来在看socket编程,碰到一个问题就是:当客户端很多时,比如上万,十万。。。服务器该如何设计,之前是当有一个客户端连上来时就是在服务器端开一个线程来监听客户端的消息,这时问题就来了,客户端多了,服务器的压力自然会很大。请教各位有什么好的方案。
补充:我想p2p模式可以解决上面的问题,但除此之外有没有别的合理的方案呢?
...全文
584 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
萨拉嘿 2010-07-28
  • 打赏
  • 举报
回复
http://blog.csdn.net/sodme/archive/2005/06/12/393165.aspx
http://www.cppblog.com/jack-wang/archive/2009/03/05/70962.html#75575
参考。。主要还是功能的划分
绿色夹克衫 2010-07-28
  • 打赏
  • 举报
回复
如果是基于DHT的P2P网络,10万确实不算什么!
SadEmprie 2010-07-28
  • 打赏
  • 举报
回复
lz啊,个人意见,在这儿干说是说不出个所以然的,如果你真的想深入研究一下,不如去看看nginx的代码,这个web server的性能很好的,不过是linux下的,个人意见用C#写大型服务器不是件太靠谱的事~~ 呵呵。
footman2046 2010-07-28
  • 打赏
  • 举报
回复
楼上提供的资源不错,谢谢。
Neil198 2010-07-27
  • 打赏
  • 举报
回复
负载均衡。多弄几台服务器
chichenzhe 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 footman2046 的回复:]
呵呵,怎么就没看懂我的意思呢,我说了只用一台pc吗?可以有多台,但不想完全靠服务器去抗。我是想请教一些具体点优化的方案,但凡有点逻辑的人都会想到通过添加服务器数目来负担负载...,我觉得思维,模式是非常重要的....
[/Quote]

做分布式 的网络应用更复杂,更需要功底.相关技术上不比1台实现起来简单.但压力负载却会改善很多.
我给你转的贴是一个相对来说 只需要网络编程够功底的 解决方案.

当然了,对于上万级的应用,我只能给你提提招,细节思路也帮不到你.因为我只做过上千的.
footman2046 2010-07-27
  • 打赏
  • 举报
回复
呵呵,怎么就没看懂我的意思呢,我说了只用一台pc吗?可以有多台,但不想完全靠服务器去抗。我是想请教一些具体点优化的方案,但凡有点逻辑的人都会想到通过添加服务器数目来负担负载...,我觉得思维,模式是非常重要的....
chichenzhe 2010-07-27
  • 打赏
  • 举报
回复
你自己计算好了
10W个TCP连接
默认每个TCP连接的不可分片缓冲内存大约是4KB这样 SEND和RECV都有,那么是8KB左右
其次,这种规模的TCP连接,根本不能考虑使用消息的IOCP或者EPOLL之类的
光消息发送也会吃掉太多的系统资源,包括投递的内存等操作太消耗资源
IOCP和EPOLL为的是提高网络响应效率,而不是说为了能够更多的连接,这一点大部分人都没吃透!!
只能用基本的SOCKET
使用定时 SELECT轮巡来实现
注意,系统不可分片内存不同WINDOWS有不同设置,都比较有限,很多系统调用都需要使用这个
当这个内存开销完,新的连接就无法实现了
测试必须在WINDOWS SERVER下进行,非SERVER系统对系统资源的调度和SOCKET分配有一个较大限制
10W个,在64位下没什么问题的,系统是根绝本机IP和端口与对方的IP和端口来确定一 TCP连接
理论上这个数字是无限
在WIN 2003下,极限大约是25W个连接
---------------------------------------
http://topic.csdn.net/u/20100720/18/da25b289-907b-452b-b4f4-006232ac3543.html?42806



上面是有人解决的方案.

不过需要的功底还是比较深的,还需要一台64位的PC SERVER

祝你好运.
chichenzhe 2010-07-27
  • 打赏
  • 举报
回复
一台PC的可用端口只有65535个.....

10万....你丫的...
特别 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 footman2046 的回复:]

不是只用1台服务器,可以有多台,但我不想用增加服务器来解决问题。10万个用户在线很正常的事,腾讯不是有1个亿的用户同时在线吗(这只是QQ,还是没说的应用)。我有一个想法,就是用1个线程来监听server打开的端口,当客户端有数据过来,server端拿到后,将数据发给另外一个线程来处理,这样的线程可以有多个(几百个一般pc还是抗的住的),这样就避免了有多少个客户端,服务器端就至少有多少个线程来处理……
[/Quote]
腾讯要是只用一台服务器能实现1亿用户同时在线的话,啥也不卖了,只要卖这技术就发了
wangyue4 2010-07-27
  • 打赏
  • 举报
回复
腾讯肯定是有服务器群的。只有一台服务器不太现实。lz用的是tcp吧。只要有socket连进服务器就开线程去处理。这个做法同时几百个线程是可以的。10万个的话不太现实。
nyq1999 2010-07-27
  • 打赏
  • 举报
回复
这么多用户只能服务器去扛,凭数量扛,不是质量。这时cache很重要
footman2046 2010-07-27
  • 打赏
  • 举报
回复
不是只用1台服务器,可以有多台,但我不想用增加服务器来解决问题。10万个用户在线很正常的事,腾讯不是有1个亿的用户同时在线吗(这只是QQ,还是没说的应用)。我有一个想法,就是用1个线程来监听server打开的端口,当客户端有数据过来,server端拿到后,将数据发给另外一个线程来处理,这样的线程可以有多个(几百个一般pc还是抗的住的),这样就避免了有多少个客户端,服务器端就至少有多少个线程来处理客户端请求。 初学者,各位见笑了哈。
mjp1234airen4385 2010-07-27
  • 打赏
  • 举报
回复
用1个服务器,同时承受10万用户,没有搞错。
你问问专业的设计人员,什么样的硬件配置才能达到你的要求。
同时10万用户在线传送数据,小型机都抗不住,
你要服务器抗??
你有10万用户同时在线吗?

顶3楼的
萨拉嘿 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 neil198 的回复:]
负载均衡。多弄几台服务器
[/Quote]
功能划分,通信、逻辑处理、数据存储都划分开来,哪些是短连接哪些是长连接设计好
footman2046 2010-07-27
  • 打赏
  • 举报
回复
我也想过这样这样做但是感觉这是没办法的办法。。。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧