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

  • 主题发起人 一个过客
  • 开始时间

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
在互联网上的TCP/IP通讯中,一个server如果带大量client,比如1000个,如果server
有某个消息需要及时送达所有客户端,而且尽量保证减少延时,那么应该怎么做?

比如server端保存了一个在线的client列表,发送消息的时候就循环遍历这个列表,
给列表中的每一个client发送,但是循环1000次也是一个不短的时间,排在列表最后的
client将比第一个client晚收到消息不少。

方法一:改用UDP的组播(不是广播)方式,一次全部发送出去,这样不用遍历列表。但是
我试验了一下(用在本论坛搜索到的那个MulticastSocket控件),好像组播不能跨网段,
只能在同一个网段内实现;
方法二:用线程。不过用线程一样涉及到遍历列表1000次的延时。

不知道大伙遇到这种问题是怎样解决的?
 
定义一个消息号,client收到这个消息号就主动向server
要求得到该消息,怎么样? client端收到 广播信息有一定
的先后延迟我觉得是不可避免的.
 
>>定义一个消息号,client收到这个消息号
我发这个消息号给每个client也需要遍历一遍列表啊。

>>client端收到 广播信息有一定的先后延迟我觉得是不可避免的
那么那些股票/期货行情软件怎么能够做到实时呢?而且还有那么多的客户端同时在线?
 
>>我发这个消息号给每个client也需要遍历一遍列表啊。
是啊,不过这比你发送整个消息的延时少多了,用了线程可以更少些。
或者你在 client 端开一个工作线程对 server 端就行轮询,如果
server 处于有消息状态,就获取相应信息.
 
如果客户端轮询,会把server累死的
 
定时轮询了,那些股票软件也不是真正实时的吧。Windows
本身就不是实时操作系统,更不用说网络速度的原因......
 
股票/期货软件如果不是实时的就卖不出去了
 
用多线程好了,每个线程管理一个或多个client
 
对,这也是一个办法,可是想到如果有1000个用户,就会有1000个线程,就太可怕了呀
 
怎么可能实时
你想windows要调度线程还需要时间.顶多你把线程优先级调高点。
网络连接状况好的客户端也必然比差的先获得数据包.
 
试试看chenxz的方法,一个线程管理10个client,而且send又不会阻塞,第一个和最后一个最多差0.1S
股票软件不是实时的,一般来说慢2-3个min
 
你的 server 用的是 windows系统吗,除非有多个CPU.
否则用了多线程也不会有效果。
 
想想那些:联机售票系统
采用先来先进,先进先出的原则,也就是C端向S端提交信息,然后排入队列
 
>>否则用了多线程也不会有效果。
请说详细一点。你的意思好像是说,windows发送数据的时候都是单线程的吗?
 
凡雨飞雨:事啊,我知道有很多这样的系统,不过我需要的是一个尽量实时的系统,
类似于期货行情软件(股票软件我不清楚,不过期货软件延时都是<1s的)
 
windows系统里的线程由内核调度轮流获得 CPU 的执行时间片
(根据优先级决定获得时间的长短).如果你只有一个CPU,就意味
着在同一时刻只有一个线程在运行,所以不会省时间.
 
那么在这个系统里面,多线程就没什么意义了?

不过怎样才能尽量做到实时呢? 特别是那些期货行情软件延时都是<1s才能卖钱的
 
能否使用非阻塞方式(异步)来发送给客户端消息? 这样可以一发送后马上返回。
 
非阻塞方式也一样,如果我是2000、3000个用户在线呢?遍历一遍的时间还是有点。。。

非阻塞方式 和 我前面说的用UDP就差不多了
 
[:D]在多线程的方式下遍历时间是非常短的,不管是阻塞还是非阻塞, 这是一个非常浅显的问题,
 

Similar threads

S
回复
0
查看
747
SUNSTONE的Delphi笔记
S
S
回复
0
查看
696
SUNSTONE的Delphi笔记
S
D
回复
0
查看
792
DelphiTeacher的专栏
D
D
回复
0
查看
747
DelphiTeacher的专栏
D
顶部