首页新闻找找看学习计划

即时通讯中消息群发机制

0
悬赏园豆:50 [已关闭问题] 关闭于 2014-01-20 10:29

我目前开发的系统用到即时消息推送,而目标地址可能成百上千。刚开始我打算使用UDP组播来实现,结果好像大部分路由器都不会转发组播数据包。问题如下:

  1. UDP组播能否经过各种型号的路由器,在广域网上实现消息群发;
  2. 若第1条不行,那么是否只能针对每个客户端逐个发送?
  3. 若要逐个发送,是使用一个端口按顺序发送好,还是多线程多个端口并发效率高?
  4. QQ群的消息发送采用的是什么机制?假如我有个500人的群,我估计依次发送延迟太大,若并发则容易造成瞬时网络拥堵。

期待朋友们的无私帮助。

莱布尼茨的主页 莱布尼茨 | 初学一级 | 园豆:156
提问于:2013-01-19 05:46
< >
分享
所有回答(3)
0

上千了就不要采用多线程的同步socket了,改用异步socket发送吧。

其实才几千个目标地址,tcp应该也能搞定的吧,记得用iocp的话达到上万的并发数也不是太难的。

天方 | 园豆:5264 (大侠五级) | 2013-01-20 18:45
0

开十个线程专门负责发不就行了,线程依次标记为1到9。你要发给谁,然后你直接把socket句柄以及需要发送的数据包,随机生成一个0到9之间的随机数,然后就塞到这个对应的线程的消息队列里面,让他去发呗。很简单的事情,如果你觉得C#的不放心,自己弄C++写,异步重叠就行了,不过原理还是按照上面的。当然这里最后到底是10个线程还是多少个,看你需求场景了。如果你搞不定的话,外包给我,性能参数给我,只要别整太变态的性能参数,如十万个客户端,0.5s延迟发光一个数据包有1M的文件,那我就没辙了

BLoodMaster | 园豆:135 (初学一级) | 2013-01-23 02:17
0

LS兄弟只回答了部分问题。我查阅了相关资料,对于UDP发送端而言,由于一般情况下只是单网卡的主机,就算多Socket异步发送,数据还是排队一份一份出去,反而损耗了线程切换的时间。对于网络通信而言,几百几千个瞬时发送量对单个Socket来说并没什么负担。若用的是TCP连接,则可能需要等待客户端响应,为了防止单个连接阻塞后续通信,可以使用多Socket异步通信。

再挂一段时间,没其它观点的话就结贴!

莱布尼茨 | 园豆:156 (初学一级) | 2013-01-26 08:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册