请描述一下你的聊天程序的建立方式。连接用tcp还是udp?点对点还是有服务器支持?
然后给你提供解决方案。

解决方案 »

  1.   

    ok,大家都登陆服务器。
    这个就好办了。
    A,b,c为client,b中有A的好友。
    先讨论以服务器为主的方式:
    A 登陆--->服务器设置A的状态为logined...ok?
    A 注销--->服务器设置A的状态为unlogined...ok?
    好了,现在B登陆了,服务器 中如果保留了B的好友列表,那么就
    给B发送好友列表状态。
    哪么,A如果机器shutdown了呢?没有注销过程,服务器怎么知道
    A的状态呢?这就需要A登陆后,服务器在固定的时间内要和A监测
    心跳状态。这个说起来很高深的样子,实际上只要服务器定时向
    已经登陆的client发送udp包,问询客户端:喂,你还活着吧?
    然后客户端说:废话,我当然还活着。当服务器在多次询问某个客户
    端没得到响应,哪么,服务器就把客户端设置成为unlogined,同时
    看看这个客户A有没有好友,有的话就通知这些好友:你的朋友down啦,
    因此状态就改变了。具体实现要看具体情况,但是基本是这个原理。
    注意udp可以发送广播包的,可以不必每个A的好友都发送消息,只需要
    统统发送一遍,由客户端自己决定需要不需要处理发来得广播包。
      

  2.   

    如果服务器不打算做得太复杂,哪么,也可以把控制权交给客户端
    服务器中维持一个登陆状况列表。大概是下面这个样子:
    userid 
    lastactivetime
    其中客户端每隔一段时间,我们假定为5秒,给服务器发送一个请求
    说:hi,I'm here.然后服务器只需要更新userid相关的lastactivetime
    为当前时间就可以了。
    如果客户端断线了,哪么就不会发送hi,i'm here请求了对不对?
    哪么服务器需要一个thread,定期检查一下登陆客户列表,看看
    各个lastactivetime是否比现在的时间差n秒,我们可以设置为
    60秒,也就是说,如果客户端在1分钟之内都没给服务器发送存在请求
    的话,哪么服务器就认为这个客户down掉了,因此把该客户从客户
    列表中去掉。
    上面讲的是存在状态检测。
    如果按上面这个思路去做,哪么检测好友的状态也好办乐。
    客户B,每n秒,比如10秒给服务器发送请求,送上所有好友id
    让服务器判断以下好友是否在线就可以了。
    是否回答清楚了你的问题?