我正要着手做一个可以让3000-5000人同时在线的服务器端程序(100分)

S

songmk

Unregistered / Unconfirmed
GUEST, unregistred user!
大虾们给点建议

indy 我是不大想用了
ics可以吗?
还是用其它的什么东西? 服务器端要采用多少个线程?采用什么模式?
如果能有些源码看看更好啦 分不够可以加
 
估计直接用Socket的API比较好。别急,等会张无忌就会来了,呵呵。
 
SOCKET API,觉得难的话用Indy,为什么不想用?
Indy有个线程池很好用,或者你强的话用完成端口,我菜,不会/张无忌会,不过这几天好像没看到他。

 
张无忌好象正忙着找job
 
哦?这段时间怎么这么多失业的~呵呵~`咱也是
 
我的想法是用ICS,然后创建100个线程,每个线程服务30个client
我的程序发送的数据量不大,但发送比较频繁

问题是怎么管理这些线程? 每个线程都要去轮训看有没有新client进来?
还是主线程发现有client进来 就分配给某个比较空闲的线程?

谁要是有ICS或socket api线程池的例子,不要说给分 给钱也行啊
 
张无忌找工?
他正在创派吧?[8D]
 
张无忌还没来??? [?]
 
已经找到了:)
估计他要让你用完成端口:)
 
千万别用Indy, Indy的机制决定它的效率非常低。勉强可以用Delphi的基于消息的TServerSocket和TClientSocket, 建议用完成端口方式或回调函数型Overlapped方式。
根据微软的测试报告,线程阻塞模式最多只能支持1008个连接,消息模式最多4800多个,Overlapped方式和完成端口方式都可以支持近50000个连接(p4 1.7G CPU, 1G RAM的普通pc机),完成端口稍胜一筹,最多支持49997个连接,并且cpu占用率稳定在50-60%, Overlapped方式在50000个连接时会掉120个左后,并且CPU占用超过90%。
至于你说的Indy的机制就是线程阻塞模式,ICS则是基于消息的机制。看来都不能满足你的要求。
 
从编程难度上来说,回调函数型overlapped模式比完成端口模式编写困难。要高效必须用线程池。而完成端口不过是系统底层直接支持并优化过的一种回调函数式overlapped模式而已。
并且完成端口编程并不如想象中的那么复杂(应当说太简单了,甚至比基于消息的模式编程更简单)。
因此推荐使用完成端口模式来做
 
Another_eYes, 谢谢你的回复

有完成端口的简单例子吗???
 
正在写完成端口控件
 
to: Another_eYes

能把完成端口控件的源码给我一份吗? 万分感谢 300分行不行?
 
偶也来灌水。偶也觉得完成端口没有问题。借此地与Another-sYes商讨:
1.偶没有看到MS的文章要求做空连接轮询,但王坏人说要。看看:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1986674
2.监听线程你采用什么策略?
a.直接调用阻塞函数Accept或WSAAccept,这样在关闭服务器时阻塞函数还没有返回,你如
何终止线程?
b.使用阻塞函数,但加WSAEventSelect,在有FD_ACCEPT事件时调用Accept,这样可以通过
SetEvent终止监听线程,但不可避免地需要用户模式与内核模式的切换。虽然切换也未尚
不可,但如果真要求性能是否......?
c.使用MS Sock扩展函数AcceptEx,因为它支持完成端口,但需要对未决连接进行连接时间
轮询以防止“拒绝服务”攻击。这肯定是效率最高的一种方式。可是实现起来是不是有点
麻烦?

楼主兄弟,我有现成的源代码,是不是给个Email地址我在你这混点分? [:D]
 
barton:
我要源码,收到后开贴200分,不食言
ok923@163.net
thanks
 
发走乐,给分乐[:D]
 
邮件等待中...
 
回barton:
1. 我个人认为需要,因为如果对方异常断线(比如拔掉网线),则完成端口不会返回通知消息。只有到给对方发送时才会得知连接已中断。
2. 我的监听策略是开个线程调用阻塞式WSAAccept等待。
a. 不会存在线程无法终止的情况,只要简单调用closesocket关闭监听的端口,则线程中的WSAAccept会立刻返回SOCKET_ERROR,此时便可安全退出线程了。
b. 我不会用这种方式。因为a已经满足我的要求了。
c. 同b,尽管它的效率是最高的,但增加的效率又花在防止DoS上得不偿失。
 
barton:
我要源码,见者有份
lotuscheng@163.com
 
顶部