如何通知用户另一个现在在线?

时间:2009-05-07 02:27:50

标签: messaging instantmessenger

我正在使用yahoo messenger与我的朋友聊天。每当我的一个朋友上网(几乎是中间),YM都会通知我。雅虎怎么样! (和其他公司)做到这一点?就我猜测而言,有一些技术可以解决这个问题:

  • 拉动:客户端(可能持续500毫秒)询问服务器哪些用户(在用户列表中)刚刚联机,然后通知用户。

  • 推送:服务器确定哪些用户上线,然后向客户发送通知。

第二种方法更容易被接受。用户的数据可能包含他的朋友的列表(他将他添加到他们的列表中),并且登录事件会提升,服务器应用程序将向此列表中的所有用户发送通知消息。

好的,这只是我的猜测。它是如何在现实中实施的?你能告诉我吗?

谢谢。

8 个答案:

答案 0 :(得分:3)

服务器正在推送数据。服务器有你的朋友列表,更重要的是你的列表列表。当您登录时,它会查看第二个列表并将消息推送到已连接的每个客户端。真的很简单。请查看Pidgin的源代码(pidgin.im),了解更具体的实现细节。

答案 1 :(得分:2)

我建议使用Wireshark或任何其他网络流量检查器,以确切了解Yahoo Messenger在运行时发生的情况。

答案 2 :(得分:1)

应该是“推动架构”。

服务器不能容忍持续拉动大量用户。

答案 3 :(得分:0)

可能长期存在的HTTP请求。 IM客户端调用服务器上的HTTP方法,但服务器在更新之前不响应。此时它以“更新”响应,然后IM客户端调用另一个HTTP方法来获取更新。

真正的推动是不可能的,因为互联网上的许多(大多数?)人都在NAT路由器之后。

答案 4 :(得分:0)

它使用与Buddy Check类似的技术,但只会让您知道用户是否希望您知道。但好友检查实际上给了你真实的真相。

答案 5 :(得分:0)

我同意其他人的意见,你可以自己检查一下源代码或网络数据包,但从另一个角度思考:当你拥有成千上万的用户时,哪种方法更有意义,大多数用户可能只有几十个“伙伴”?

  1. 每隔几秒就有数十万用户ping您的服务器=大量负载
  2. 当他们的朋友的状态发生变化时,将更新推送到客户端,这可能会发生在更小的范围内 - 每隔几分钟就会发生一些更新。

答案 6 :(得分:0)

当您登录时,雅虎会向您列表中也在线的所有人发送(推送)“在线活动”。如果连接是通过HTTP进行的,那么您和Yahoo的服务器之间就会进行ping / pong交换以保持连接活动(wikipedia) - 这允许通过NAT和诸如此类的东西进行此推送。否则,TCP / IP连接在您登录期间保持活动状态。如果ping / pong不成功(经过多次重试,您会认为),Yahoo服务器会向所有在线朋友发送(推送)消息,通知他们“离线事件”。

所以回答你的问题,这是一个推动。

答案 7 :(得分:0)

我知道gtalk over gmail和facebook使用comet。这看起来像一个很好的技术,但它很昂贵。这是PHP中的good tutotial