我很好奇WhatsApp在不使用时如何接收消息。

我的意思是,我知道WhatsApp使用Internet连接而不是手机网络来工作。想象一下我几个小时都没有触摸手机。那时,一个朋友在WhatsApp上给我发送了一条消息。我马上得到。这是否意味着WhatsApp始终保持Internet连接连接?这是否意味着WhatsApp充当服务器,打开电话上的端口?还是长时间运行的HTTP请求?

评论

另请参阅whatsapp.com/faq/en/s60/20910578

另请参见highscalability.com/blog/2014/2/26/…

#1 楼

起初,我以为这很可能是Android云到设备消息传递的一个实例,但事实并非如此:WhatsApp并未声明必要的权限,并且可以在Eclair(Android 2.1)中运行,而云到设备消息传递(及其替代品Google Cloud Messaging)至少需要Froyo(Android 2.2)。

但是,很可能是某种推送通知服务。在没有访问WhatsApp的源代码的情况下,无法确切地说出它是如何实现的。

关于不使用时能够接收消息的部分相对容易解释。该应用程序几乎肯定具有一项在后台运行的服务,以定期与服务器签入(或接收服务器推送或执行的任何操作)。当您收到消息时,该服务会弹出通知。

关于服务器如何执行推送的问题,这是一种可能性(同样,如果没有源代码,我将无法验证) :


WhatsApp启动并打开两个套接字:一个在监听,一个向服务器发送消息。
WhatsApps在第一个套接字上开始监听。
WhatsApp将包含您的电话号码和监听套接字端口的消息发送到服务器,并等待确认。
服务器在消息中记录电话和端口号以及消息来自的IP地址。
服务器将确认发送到应用程序。
应用程序接收到确认并关闭消息套接字。
带有目的地电话号码的消息会进入服务器。
服务器使用与您的电话号码关联的IP地址和端口号,并使用该信息将消息推送到您的电话。

要正常工作,该应用将需要监视网络连接的状态并在必要时重置侦听套接字/重新发送注册消息(例如,如果IP地址更改)。

评论


Whatsapp是否取决于Playstore应用?从Wikipedia链接报价:它要求运行Android 2.2或更高版本的设备也安装了Market应用程序。因此,可能并非完全如此,但肯定是基于相同的原理。但是,您可能希望包括文章第二段的摘录,以使您的答案更有价值(并获得更多好评;)

– Izzy♦
13年4月19日在19:14

您说得对,@ Izzy,我应该添加更多详细信息。但是,当我坐在Subway上编写SGS3时,这很难做到。我已经更新了答案。 :-)

–Trebor粗鲁
13年4月20日在3:26

Nat不允许步骤8,即使mobile处于静态ip,也绝不会这样。可能的方法是Xmpp或长轮询http

–user37120
13年7月6日在15:09

它确实具有必需的权限。它在Play商店中列为“从Internet接收数据”。见android.stackexchange.com/a/61794

–nyuszika7h
15年3月14日在18:59



不幸的是,传入的TCP连接在移动设备上几乎是不可能的。它们中的绝大多数没有公共IP地址,即使它们具有公用IP地址(例如,对于支持IPv6的运营商),通常也会过滤入站连接。如今,大多数应用程序要么使用Google的推送服务,要么将自己的持久客户端滚动到服务器套接字连接(最著名的是Facebook)。根据我的经验,WhatsApp似乎采取了一种混合方法:如果GCM可用,则持久套接字在空闲几分钟后将关闭。

–lxgr
16年1月23日在16:16

#2 楼

我当然可以确定WhatsApp不会打开任何监听端口。大多数ISP阻止传入的请求,这将不起作用。

WhatsApp提供服务。基本上,这意味着从技术上讲,您永远不会退出WhatsApp。因此,“不运行”时接收消息的方式与运行WhatsApp时接收消息的方式完全相同。

客户端(在本例中为WhatsApp)连接到服务器。客户端维护该连接。当服务器有新要说的内容时,它会通过该连接将其发送给客户端。仅此而已。

您的第一个猜测是正确的。退出机制,请参见此。


WhatsApp没有注销机制。该应用程序被设计为
始终保持连接状态,以便即使您不积极使用手机时也可以快速接收消息。这类似于SMS
的工作方式,并允许WhatsApp消息几乎立即传递。


评论


您的链接指向诺基亚-我在他们的网站上找不到适用于Android的类似问题。您确定同样适用于Android吗?他们的Android常见问题解答中的此问题表明,它采用了PUSH架构(在“消息是否仍需要很长时间才能到达您的手机吗?”部分下)-而不是持续连接的服务器/客户端。

– Dylan Yaga
13年7月25日在14:42

@DylanYaga是正确的。参见例如此答案的最后一段和Trebors在这里回答。

– Izzy♦
2013年7月25日14:48



这似乎是最合逻辑的。很多时候,这些服务被称为推送服务,但是我无法想象客户端会打开端口,实际上充当本地服务器。那肯定会引起安全问题。

– SPRBRN
2014年2月17日下午16:30

#3 楼

他们的常见问题解答建议他们使用GCM。检查“消息是否仍需要很长时间才能到达手机?”的答案?

评论


没错,FAQ暗示了这一点,但是正如Trebor Rude指出的那样,该应用没有必要的许可,因此他们不能使用GCM本身。

–丹·赫尔姆
2014-2-17在12:59

它确实具有必需的权限。它在Play商店中列为“从Internet接收数据”。见android.stackexchange.com/a/61794

–nyuszika7h
15年3月14日在18:59



从我所见,他们使用GCM(如果可用)。如果由于某种原因(例如,在没有Play服务的设备上或在网络过滤的情况下)不可用,则该套接字将无限期保持运行。

–lxgr
16年1月23日在16:18

#4 楼

与其他应用程序一样,Whatsapp作为服务运行。(始终保持连接状态)发送给您的消息将存储在whatsapp服务器上,直到30天,在此期间,您的whatsapp应该处于活动状态以接收和确认收到消息。单个帐户与用户电话号码@ whatsapp.net一起存储

评论


30天。请链接该事实的来源

– beeshyams
16年6月6日在2:10

#5 楼

我认为应该是这样的:

当whatsapp是新的时,它将使用基于PNS的解决方案,该PNS只会唤醒设备,一旦唤醒,它就可以创建与whatsapp的套接字连接服务器。

当whatsapp流行之后,现在大多数设备作为本机应用程序和本机应用程序都不会被杀死。在我的三星s8中,我无法卸载whatsapp,省电模式无法将其杀死

#6 楼

Google保持与android的连接,而apns服务器保持与Apple设备的连接,没有gcm或fcm,任何第三方都无法向Android设备发送推送通知。