关于一个server对应大量client通讯的效率的问题(100分)

  • 主题发起人 主题发起人 一个过客
  • 开始时间 开始时间
用重叠I/O一个线程管理60多个套接字,你开50个线程就够了
 
请详细说说什么是“[red]重叠I/O[/red]”?
 
我赞成张无忌的说法,在Windows下,用IO COMPLETION是在线程多,传输数据两大,都要兼故的条件下的折中办法。
但是,实现时还得去轮询各个客户。
 
那在 Linux 下该怎么做?
 
再次请求详细说说什么是“[red]重叠I/O[/red]”?
 
完成端口!
 
>>完成端口!

?????????
 
太笑话了!!当CPU全速运行一段代码时,任何线程的切换都是多余的,都会严重下降程序的性能,CPU的
很大一部分资源耗费在线程切换上面!当一个进程断断续续地有CPU的空余时间的时候采用线程技术才会
提高进程的运行效率!
还是采用遍历,让cpu全负荷运行起来,时间不会很长的(1、2秒,在异步状态下),具体的发送工作会
让socket进程和网卡在后台执行的!!!
 
不过,如果cpu全负荷运行起来,还会有“后台”吗?
 
虽然我的方法不能保证实时,但是基本能够保证同时(不许被气死)
1、保证所有客户端与服务端时间相同(客户端程序来干)
2、客户端收到信息但是不出现
3、待你认为1000个客户端都已收到的时间触发,例如你10:25发送消息,
你估计是10:28大家都搞定,那么你就在发送的消息中加入“触发时间:10:28”
,这样能够解决问题
[:D]
 
>>请详细说说什么是“重叠I/O”?
所谓“重叠I/O”,就是overlapped I/O,这个在侯捷翻译的《Win32多线程程序设计》里
说得比较清楚,你可以找来看看,也可以看看下面几篇文章,相信很简单:
设备I/O之OVERLAPPED xrbeck(原作):
http://www.csdn.net/develop/article/14/14204.shtm
12.3 串行通信与重叠I/O
http://sanjianxia.myrice.com/teach/vc/chap12_3.htm
用Win32 API实现串行通信
http://www.ccw.com.cn/htm/app/aprog/01_7_3_2.asp

>>方法二:用线程。不过用线程一样涉及到遍历列表1000次的延时。
延时并不在于遍历过程,而应该在于遍历完成之后,各个线程与客户端的通信上
因为遍历完全可以做到象Post一条Message一样简单,而PostMessage 1000次不会慢吧!

看了半天也没见你说你的Server是怎么响应Client的,难道不是每个Client建立一个线程
来为其服务吗?我印象中,Indy的SocketServer就是这么干的。
说说你的做法?
 
关于重叠IO,我看了你介绍的文章,发现是串口通讯的,好像和我的要求不太一样啊!

我目前就是用的Indy控件,应该是自动为每个client创建线程的吧?我没做什么特殊的
处理,就是维持着一个用户列表,其中每个用户都是AThread.Data。
procedure TForm1.ServerOnConnect(AThread: TIdPeerThread)
var client:TMyClientData;
begin
client:=TMyClientData.Create; //创建新用户
client.Connection:=AThread.Connection;
ClientList.Add(Client); //把用户添加到列表
AThread.Data:=Client;
end;

我的问题是,如果我有1000个用户,那么如果有一个消息需要[同时]发给所有用户,处理
代码是不是应该类似这样?
for i:=0 to ClientList.Count-1 do
TMyClientData(ClientList).Connection.Write(myMsg);
在这里,第1000个用户是不是会等到前面999个用户Write(myMsg)完毕才会受到消息?
我担心的就是这个。
 
如果不用MultiCast的方法,不管使用IO COMPLETION 还是一个线程服务一个客户,服务端要实现主动通知客户端,除了遍历外还能有什么更古怪的方法?
 
我给一个建议,用client去找server算了,每个都规定一定时间(如:0.1秒)有消息就出来
没有就不理他,能实现你的要求吗?
 
如果用线程,应该也会有一个线程列表吧? 当通知所有用户的时候,是不是也牵涉到
遍历一遍这个线程列表?

我总是对遍历这个动作不放心,我想那些大型系统,比如qq,这个列表怎么也得有几万
吧?遍历一遍能吃的消?

>>我给一个建议,用client去找server算了,每个都规定一定时间(如:0.1秒)
如果1000个客户都每个0.1秒到服务器查询消息,那服务器肯定要累死了!
 
好多方法。要动手试试才知道行或不行。楼上。强烈建议你把各位兄弟的方法试一下。
给列一个比较结果。
 
用完成端口和重叠I/O都可以达到目的,用重叠I/O可以处理5000个以上的连接,
 
后退
顶部