小弟现在碰到这样的需求:
1,服务器定时扫描数据库,得到数据。
2,根据已经登录的客户端的ID号,处理数据(即不同客户端有不同的数据)
3,把数据发送给客户端。客户端的数量比较多(>500)
目前的想法是采用UDP协议,selectIO模型和线程池。请大家给点意见

解决方案 »

  1.   

    每个客户的数据量大吗?
    如果不大,可以考虑用tcp。
    udp要检测、重传,很麻烦。
      

  2.   

    如果是不能出错的数据,恐怕只能使用 tcp
    如果数据不重要,容错,就使用udp 好了
      

  3.   

    不如直接用Tcp,传输数据是个长连接。
      

  4.   

    总结一下,
    大家现在都趋向于用TCP协议,分歧的地方是用长连接还是用短连接
    先确认一下这两个概念吧
    长连接:客户端登录上来后,就直到下线或者网络异常才断开。
    短连接:客户端定时登录上来,获得数据后就断开。
    如果是这样理解的话,应该用长连接,因为我发送的是实时数据,数据变化很快。如果频繁地建立TCP连接,也好耗费很多资源和时间
      

  5.   

    TO ppc686() 这事情总得有人干啊!
      

  6.   

    我觉得用TCP还是UDP协议不是很重要,因为都要应答机制。
      SERVER发包A,CLIENT返回确认包A,SERVER再将包A删除。
      SERVER可以连续发包A,包B,再连续接收确认包A,包B尽量不使SERVER的线程阻塞。IO模型使用重叠好些,这样速度不受限。
    线程池是要的。楼下继续
      

  7.   

    不知道我的回帖是否有点晚哈,首先确定是采用tcp还是udp的问题,我认为关键要看你的数据是什么特点了,如果对数据的准确性要求比较高,那应该采用tcp,如果数据差一两个字节没啥关系那可以用udp,一般用udp的场合都是这样的,比如视频传输,丢个1,2侦没啥事.比如我现在做的火灾报警网络,那是少一个字都不行的,必须用tcp,而且考虑到你的发送数据是有真对性的,每个用户都不同,所以还是建议你用tcp.
    关于io模式的问题,500个用户不少了,我想最好用完成端口,不但效率高,而且还相对透明,他的线程池是不用你维护的.
      

  8.   

    to ppc686()
      俺是没多少经验,也就做过半年的UDP打洞的P2P聊天程序,现在这个需求跟聊天程序大不一样。所以才出来请教牛人们。
      我想“牛人们”都是技术上牛,而不是嘴巴上“牛皮烘烘”
      

  9.   

    谢谢MORI3000的建议,现在这个项目正在处于设计阶段,需要这样的建议
      

  10.   

    如果数据传输的准确性要求比较高,我的建议是用TCP短连接,关于IO倒不是一定要用SELECT,涉及到效率问题.可以将用户分成几批,按某个属性分类,分别放入到几个队列里进行处理.分成几批要看按服务器扫描的时间间隔来确定,意思就是从处理完队列中第一个到处理完队列中最后一个的时间应该是等于服务器扫描间隔的.
      

  11.   

    不要自己无知还这么NB。你RP不好,看鬼才会教你。
      

  12.   

    基于你对socket通讯了解不多,建议你使用mfc的CSocket,使用起来比较简单,网上的例子也很多(前提是你的程序通讯量不大,象你说的,就几K,允许点连接延迟(我想最多延迟几秒至十几秒吧))当然使用IO完成端口效果要好的多,但是技术比较复杂,又涉及到多线程,不是短时间能明白的(“win32 多线程程序设计”这本书中有一个IO完成端口的例子)
      

  13.   

    我发现 ppc686 的性质很恶劣,不愿意教人家,还侮辱人家,太无耻了。每个人都不是从不会到会的吗?
      

  14.   

    waini12(魔刀王子)对这个技术你能说出个什么门道吗?否则你就没有资格品头论足。切!
      

  15.   

    上次我跟我单位的一个牛人提起csdn,他问csdn是啥?他做flash-->video的,Macromedia网站上有他网站的链接...
      

  16.   

    弱弱地问一下,楼上要表达什么?表达CSDN上的人够菜?还是你单位的人够牛?
      

  17.   

    如果一次 发送几k的话,建议不要用UDP, 
    如果要用, 分开发,控制在1400以下。  客户端要做 接收确认。
    服务器要做重发策略。如果用tcp
    客户端的数量比较多(>500) 
    用IOCP