1

我正在使用 yahoo messenger 与我的朋友聊天。每次我的一个朋友(几乎是中间)上线时,YM 都会通知我。雅虎怎么样!(和其他公司)如何实施?据我猜测,有一些技术可以解决这个问题:

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

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

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

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

谢谢你。

4

8 回答 8

3

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

于 2009-05-07T02:51:02.303 回答
2

我建议使用 Wireshark 或任何其他网络流量检查器来准确查看 Yahoo Messenger 在运行时发生的情况。

于 2009-05-07T02:36:34.507 回答
1

应该是“推式架构”。

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

于 2009-05-07T02:46:19.647 回答
0

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

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

于 2009-05-07T02:35:38.520 回答
0

它使用与Buddy Check类似的技术,但仅让您知道用户是否希望您知道。但Buddy Check实际上给了你真正的真相。

于 2009-05-07T02:41:53.260 回答
0

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

  1. 每隔几秒就有数十万用户 ping 您的服务器 = 大量负载
  2. 当朋友的状态发生变化时向客户推送更新,这可能发生的规模要小得多——每隔几分钟更新几次。
于 2009-05-07T02:43:11.603 回答
0

当您登录时,雅虎会向您列表中同时在线的每个人发送(推送)一个“在线事件”。如果连接是通过 HTTP 进行的,那么您和 Yahoo 的服务器之间会进行 ping/pong 交换以保持连接处于活动状态(维基百科)——这允许这种推送通过 NAT 等进行。否则,TCP/IP 连接会在您登录期间保持活动状态。如果 ping/pong 不成功(经过多次重试,您会假设),雅虎服务器会向您的所有在线朋友发送(推送)消息,通知他们“离线事件”。

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

于 2009-05-07T03:32:22.237 回答
0

我知道 gtalk over gmail 和 facebook 使用comet。这看起来是一种很好的技术,但价格昂贵。这是一个很好的关于 PHP的教程

于 2009-05-07T03:32:28.773 回答