像QQ那样的程序,是怎样检测客户端是否在线的?由服务器向每个客户端轮询?
怎样知道好友上下线的?是由服务器检测到再发给客户端?
客户端意外终止,其它好友是怎么知道你下线了的,是服务器告诉他们的,还是客户端一个一个好友的轮询检测?
这些都涉及到效率问题,之前没写过,往有经验的指导指导,说详细点.

解决方案 »

  1.   

    异常退出的话,由于客户端在规定时间内无法发出HELLO包,所有服务器判断其掉线。这样会给该客户端在线好友群发此消息
      

  2.   

    QQ 10m发送一个HELLO包,就是用的心跳机制。
      

  3.   

    有个问题就是,如果服务器端计算当前时间减去每个客户端的最后发送hello的时间,如果客户端数量巨大,遍历时间可能会较长,有什么好的算法来处理?
    还有一个问题,每个客户的好友怎样存储在数据库中?要为每个客户都增加一个好友的表吗?因为好友是多个的,不像年龄,性别,帐号都是唯一的.建立数据表还是个难题啊..
      

  4.   

    1 用QQ号作为客户端ID,将客户端信息存储在map里面。通过ID进行查找应该是很快的。
    2 他的好友列表查询返回很快,可能有专门的一个好友列表的表单。通过ID获取其好友列表。不然千万用户这么大的查询量时间短不了。
      

  5.   

    所有的消息通过服务器转发,是不是负担太重了一点,QQ不是用的P2P吗?
      

  6.   

    通过P2P的话,每个客户端都要与所有的在线好友之间通信,也有负荷的压力.
    服务器上应该还是会维护一些基本信息
    P2P可以用来传输文件等比较消耗资源的应用..
      

  7.   

    我想Tecent在服务器端做了很好的算法优化了,
    从腾讯的面试题就知道了,
    服务器端的性能优化题是必考的
      

  8.   

    还是客户端主动定时发消息通知服务器端的, 服务器端转发数据给客户端Socket返回错误, 自然就是相应的客户端不在线或关闭
      

  9.   

    这种优化是全方位的,QQ这么大的用户群,服务器,通信,算法等优化还是很牛的,可以参考一下
    http://topic.csdn.net/u/20090704/15/5ceebb7e-e217-4f01-8519-3cb6ba95777a.html?47522
      

  10.   

    QQ客户端之间的通信是P2P的吧?还是说发消息要经过服务器,传文件是P2P?
      

  11.   

    我觉得如果好友之间视频或语言通话用服务器转发那是不可思议的,服务器转发文字消息还行,其它的应该用P2P吧?QQ的好友之间通讯是用的什么?
      

  12.   

    个人认为腾讯好友间文字通讯两者兼用,理由如下:
    几千万个用户都在聊天的话,就算是文字,通过服务器中转,消耗资源也是够大的,想想就知道,每人发一千字内容,一千万个人发,多大?
    文字聊天时,主要先通过服务器"查询"下对方的IP(或位置),再返回给发送的用户,然后,就直接向接收方发信息了,在两人聊过两遍后,也不通过服务器查询了(已经有了)当然,可能也不全是这样,这只是对于普通的QQ用户,对于会员之类的,它要把你的聊天记聊保到服务器,这当然整个聊天内容要传到服务器了,这样,是否再把内容传给接收方就不得而知了(要知道答案,去问腾讯的开发人员吧)
      

  13.   

    还有一点,如果QQ是通过P2P,那当好友突然下线时,你发的消息会被保存起来,等他上线了再发给他,如果是用P2P的话是不可能用这种功能的,要不谁替你保存.
      

  14.   

    别乱猜了。文字聊天使用TCPF协议。
      

  15.   

    我刚在做,大体是好了。不过我是用c#写的。udp协议与nat原理
      

  16.   

    应该跟采取通讯协议有关,一般udp方式可以用 |客户端| 向 |服务器| 发“心跳包”的方式维持在线状态。
      

  17.   

    可惜我之前不是用VC开发的,而且不是仿QQ
    是仿照MSN的(VB.Net)。
      

  18.   

    QQ的通讯不是P2P,你抓包来分析一下就知道了~~
      

  19.   

    如果CLIENT突然崩溃的话 有KEEPALIVE消息。 而且下线消息也不是立刻通知其它人的。而有的时候会立刻通知其它人。这里估计也有个效率考虑吧。
    另外 C - S - S -C。 也要考虑P2P情况。
    语音了 视频了 全都走SERVER哪是不可能的。
      

  20.   

    http://download.csdn.net/source/1477566
    http://download.csdn.net/source/1352218
    参考在下这两个东西,做得挺好!
      

  21.   

    http://download.csdn.net/source/1418758
    还有一个
      

  22.   

    远程消息,UDP接受事件,遍历群组发送。没什么复杂的
      

  23.   

    心跳包检测:比如,服务器只作为接受处理,客户端,每X秒向服务器发包,(保险起见,一般连接检测3次。)连续XXX秒内没有接受到对方心跳包,服务器可以把该用户T掉,反之,客户端也一样,XXX秒内没有接受到服务器的心跳包,则服务器丢失。其他的交互,正常信令处理
      

  24.   

    竟然没人谈到群集技术,想想看,一个server能支撑多少client,就算p2p,就算iocp,就算采用高性能ace, 肯定也必挂无疑,若有庞大的server群,那才是王道,google,baidu不是吗?呵呵,,现在即将流行云计算,期待。
      

  25.   

    像QQ那样的程序,是怎样检测客户端是否在线的?由服务器向每个客户端轮询? 
    服务器和客户端有心跳,服务器每隔10秒发送一个包询问客户端的状态,规定时间内无应答,则认为掉线
    怎样知道好友上下线的?是由服务器检测到再发给客户端? 
    你的好友A上线--服务器从数据库中取出好友A的好友列表(或登录时已经由数据库加载到内存)--服务器将该上线消息广播给A列表中登陆的好友--你得到好友在线消息(不是你与好友直接通信的,都是服务器处理的)
    客户端意外终止,其它好友是怎么知道你下线了的,是服务器告诉他们的,还是客户端一个一个好友的轮询检测? 
    客户端B下线--服务器心跳检测到B下线状态--服务器从数据库中获取B的好友列表(或登录时已经由数据库加载到内存)--服务器将下线消息广播给B列表中登陆的好友--你得到好友的下线消息
      

  26.   


    一般都是设置心跳的。服务端主动心跳。肯定不能客户端发心跳。如果客户端死机了。那这个用户还卡在那里了。
    好友上下线都是通知。比如你上线,服务端1知道了。他读取你的好友信息。通过hash发给其他服务端。其他服务端检测到你的某位好友在线。就给他发一个你上线的通知。另外回一个该好友在线的消息给服务端1,然后服务器1再通知你的好友哪些在线。所以在我们看来。我们先登录上去了。好友先都是灰的。过会就正常显示了。也就是说服务端1并不知道你的好友在不在线。他也是去其他服务端查询。 本身因为数据巨大,也不可以一个服务端搞定。客户端意外终止,他所在服务端通过心跳包是可以得知的。知道了不就好办了。老办法。hash通知其他服务端你的好友你下线了。
    一般是一个服务端服务一个hash段.希望可以帮到你。 多给点分才是真的。
      

  27.   

    还有一个问题,客户端与服务器是保持TCP连接且发送心跳封包还是只发心跳封包来表示在线??