本帖最后由 VisualEleven 于 2012-02-25 14:17:58 编辑

解决方案 »

  1.   

    刚才看一下INADDR_ANY这个东西,貌似就像于0.0.0.0那我是不是可以sendto到0.0.0.0呢?
      

  2.   


    我想到可不可以发一次消息给某些QQ用户,然后QQ客户端进行转发,然后循环转发下去不知道是否可以呢?
      

  3.   

    QQ的在线好用有许多的策略,在登陆的时候会去读取一次好友列表信息,但不是全部的好友信息,如果读取一个用户的全部信息,登陆会很慢,所以在登陆过程中会选择部分重要信息,比如在线状态。比如其他的QQ空间信息,会在登陆后,再进行更新。好友在线状态,我也研究过一阵,我一台电脑开2个QQ,互加好友,如果没有通讯,一个QQ下线,用户信息也不是立刻更新,但有时候也会立刻更新。个人觉得,当一个用户如果是正常下线,服务器检测到后会将这个信息群发给在线的好友,当然QQ这样庞大的用户群体,会有延迟也是很正常,一定是用到了缓存队列的设计。
      

  4.   

    偶觉得,QQ应该过一段时间,读取一下好友成员在线状态QQ服务器上,对应QQ号,应该有一个状态信息
    服务器有一段时间没有收到QQ数据,就表明该QQ断线,将状态改为“离线”
    而其他QQ客户端每过一段时间,就读取一下好友的在线状态
      

  5.   

    一般这种做法不是客户端的事情。而是服务器端的事情。1、 服务器知道每个用户的登录状态
    2、 每个用户登录的时候,服务器根据你好友列表的状态即可主动发送在线用户状态给你
    3、 客户端只需要解析服务器发送过来的状态信息以及好友列表即可对于这种QQ类的C/S架构软件,多从SERVER架构层面去考虑设计,而不是把自己的眼光限制在DESKTOP编程的水平上。
      

  6.   

    简单的jabberd2架构, QQ上线会话建立之后, 由route向各个SM送一个登陆包就行了, SM再推给各个会话.
      

  7.   

    我这么认为的 , 用户在修改状态的时候,会去执行一条修改状态的Sql语句,然后这中Update语句上有关联的触发器,然后拿到QQ号码,自动向其好友发送状态.
      

  8.   

    (偶是菜鸟)是不是这样呢,有A、B、C、D是qq好友,每一QQ都与服务器有联系(线程),当下线的时候,服务器某值发生变动。所有QQ用户都会定时刷新好友列表,当BCD刷新好友列表的时候请求服务器,得到服务器的值,而不是服务器主动发送(或遍历其他用户呢)呢。(有没有这种可能呢)(偶是菜鸟,不对勿怪)
      

  9.   

    刚才看一下INADDR_ANY这个东西,貌似就像于0.0.0.0那我是不是可以sendto到0.0.0.0呢? 
      

  10.   

        1、我觉得,这个东西还是类似于一般消息的发送,只是发送形式从一对一到一对多。qq的一般消息是怎么发送的,它还是怎么发送。
        2、我觉得:状态信息的发送地址或者账号,不是从数据库遍历出来的,而是在用户登录的时候存储到了登录者的本地来了。不然为什么qq登录的时间很长呢?之后信息的发送那么快。
      

  11.   

    c/s构架的程序,只要是网络服务程序就必须有心跳包.否则一定时间内无操作(通信-一般是10分钟这样)就会出现连接断开,对于QQ来说不可能没有心跳包.只能是心跳周期如何设定而已.
    至于楼主说的好友在线状态.我个人的观点是.
    用户登陆.与服务器产生连接-(拥有一个唯一标识,操作句柄)-服务器修改个人在线状态(状态+ip+dk).--遍历改用户的在线好友列表.推送用户在线消息.
    因为心跳包的存在会一直导致该用户在线.
    如果下线(正常和非正常).服务器会触发closeconn.那么服务器就会找到该连接的唯一标识的QQ.依旧枚举该QQ的在线好友,推送下线.
    看起来是不难但是如果要确保这万无一失那就难了.
      

  12.   

    补充一下,上面为什么服务器修改个人状态会有ip和dk在内.
    从QQ的功能方面考虑.
    QQ拥有聊天记录功能但是不是所有的用户都启用.
    所以不经过服务器的环节可以减轻服务器压力.也就是user-user直连.这个大家查查tcp连接列表都知道了.老掉牙了.(是不是真的不记录,至于你信不信,反正我是不信的.)