/////????? 和大家讨论一个问题,参与者有分

Iforgot 2003-11-12 01:03:38
一般java服务器端是采用accept一个连接就开启一个线程。

但这种方式,连接的客户端多了线程就多了,如果一个ServerSocket的连接有2000个呢?那么2000个线程,这样,势必会使得性能急速下降(线程多了开销大,还会争用,互相阻碍)甚至程序停滞。

如果大家察看,一般程序的线程数都在10个以内。我记得好像各有书上分析建议说一个程序最好不要超过20个线程(具体的我记不清了)。

那么如果我确实一个程序有2000甚至20000个客户端连接呢?

比如大家常见的网络游戏传奇,就是如此(当然那个是windows消息方式,没必要像java轮询,这个不管它,只是举例而已)。

大家是怎么看这个问题的? 你觉得怎么解决呢? 注意不能因为一个用户而阻塞和影响其他用户哦!
————————————————————————————————————

凡参与者既给分,不够可以另开帖相送。
参与而没有的到分的,可以在本贴说明,本人再开帖送分。

________________________________________________________________________
谢谢!
...全文
25 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
Iforgot 2003-11-24
  • 打赏
  • 举报
回复
谢谢大家的参与。

这个问题,我用线程池来解决轮询问题,有状态连接保留在另一个向量队列里,发送数据也用map对保留,轮到时,才找到相应的连接进行接受和发送处理。

现在,问题可能重点是,同步处理了,多线程的同步问题。

这样基本上能保证平衡和适时高效,只是内存开销稍微高点,不过也值了(本来,不管怎样,就都要保存连接和数据的嘛!而且,开销也不是那么大)。

算算4000个时,最多也就13000左右个对象,也还可以接受,如果再做些网络优化,网络处理理论上还可以。
hyhu 2003-11-19
  • 打赏
  • 举报
回复
学习!
Iforgot 2003-11-19
  • 打赏
  • 举报
回复
另外,不用JSP技术,采用CS结构,而不是BS结构。 所以,如果JSP的方式,可以把思想和原理说出来,切勿直接谈JSP。
Iforgot 2003-11-19
  • 打赏
  • 举报
回复
不一定说的非要是20000个,我得意思是怎么样利用有限的资源达到最好的效果。


显然,如果是狂开线程是浪费资源嘛! 但,如果轮询,难免会有有的连接被查到有效前的时间过长。

线程池,我以前没有接触过,确实不懂,不过,从字面来说,好像也是要狂开线程(不知道我猜对没)。

如果转发端口,其实结果也还是一个程序开了很多线程的。

其实,有一个可以借鉴的,就是MFC,他每个数据到达时都会有消息通知,但是,我不知道他怎么实现的,论询,我前面说了,不太可能,因为会有有的连接被闲置。
tvman 2003-11-13
  • 打赏
  • 举报
回复
接分来啦
wxh512 2003-11-13
  • 打赏
  • 举报
回复
利用连接池吧
要源代码的话
给我发信wxh512@163.com
lighteen 2003-11-13
  • 打赏
  • 举报
回复
不清楚,帮UP一下
peigen 2003-11-13
  • 打赏
  • 举报
回复
无头绪

学习

支持
sujianhua 2003-11-12
  • 打赏
  • 举报
回复
学习
giftxi 2003-11-12
  • 打赏
  • 举报
回复
学习!
copyright 2003-11-12
  • 打赏
  • 举报
回复
对于网络服务这种程序,特别是游戏服务这个内容,
属于高消耗,有状态的连接,资源有限的类型
对于服务器采用多线程是必不可少的,但是想要支持
20000的同时连接,不用集群是不太可能了,
一般的服务都是多连接方式的,网络资源的耗费比较大
一个服务器支持的有限,同时考虑管理和时延,
都是采用分区管理,比如联众的房间,传奇的区概念
将用户分组处理,来达到比较好的效果
xzq686 2003-11-12
  • 打赏
  • 举报
回复
学习!!!
up
wumz 2003-11-12
  • 打赏
  • 举报
回复
利用线程池
liuyi8903 2003-11-12
  • 打赏
  • 举报
回复
学习中.
kiki0712 2003-11-12
  • 打赏
  • 举报
回复
一般的应用当采用线程池和线程队列,而象网络游戏这样的应用必须用集群服务器来处理了吧
网络咖啡 2003-11-12
  • 打赏
  • 举报
回复
我觉得可以使用端口代理的策略:

使用一个端口作为代理端口,接受请求,如果多余指定个数的连接,如20个,则将请求自动转发到另外一个端口进行处理。每个端口都有一个程序进行监听。

如连接在20个以内则使用8080端口的程序处理,20-40之间使用8080和8081两个端口的两个程序进行处理,然后依次类推。

不知道如何,我的e-mail:cqucyf@263.net

可以一起讨论,记得付上问题。
bluesmile979 2003-11-12
  • 打赏
  • 举报
回复
楼主的问题线程池应该帮不上忙的,网游的话大数量的线程都是同时处于执行期的。多服务器的话,money方面又开销太大,难哪。解决不掉
xueguoqing 2003-11-12
  • 打赏
  • 举报
回复
我认为线程我进程是有一定关系的,我想你说的这个应跟进程有关吧,线程好像是对于一个程序而言的,一个程序只占用一个进程
haode 2003-11-12
  • 打赏
  • 举报
回复
我觉得是采用高性能的服务器加上线程池。
truezerg 2003-11-12
  • 打赏
  • 举报
回复
像WEB方式的应用的话,因为web方式是无状态的。所以即使有2000个用户在访问网站,同时请求的可能也不是很高。 你要是web方式的,保证线程数不少于同时请求数即可。如果访问量极高。像sina那样。也得多服务器

如果是有状态的连接。像网络游戏的话,那多服务器吧。 我想是这样。
加载更多回复(14)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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