QQ是用Socket编的吗,如果是的话那它是不是要一直循环看看有没有给你发消息,这样一直循环CPU占用率不会很高吗?

解决方案 »

  1.   

    看来你还只学到了socket的阻塞模式。即使是阻塞模式,一般也是放到线程里。
      

  2.   

    大致的基本原理应该是大同小异的,但QQ实现要复杂的多,比如说,我们可以在QQ里查看聊天记录,修改个人资料等等,这个就需要为每个人建立一个数据库,还有,现在大多数类似于您所讲的网络程序都是基于异步socket编程的,而且,你所说的会占用大量的cpu,这个是不无道理的,肯定是这个样子的,不过像QQ这样的程序,其服务器不可能就是那么一台两台电脑就可以完成任务的,它的服务器肯定是个服务器集群,就是用很多台大型计算机去组成的一个集群,那么它的功能是非常强大的,并且会根据工作量自适应的把任务平均的分配到这些计算机中去的,所以对于这个服务器集群来说,其中的每台电脑所用到的CPU就不会很大了.
      

  3.   

    阻塞的东西不一定占cpu100%
    比如 recvfrom,select,WaitForSingleObject,Sleep,这些都是阻塞的,但不会占100%cpu,不需要知道原理,会用就行。
    阻塞的socket只要
    while(1) {
      recvfrom()
      ...
    }
    非阻塞的
    while(1) {
      if(select(..)) {//select用于查询是否有数据可接收,会阻塞,但不占cpu
        recv()
      }
    }