android 中的 GCM 与 Socket

Posted

技术标签:

【中文标题】android 中的 GCM 与 Socket【英文标题】:GCM vs. Socket in android 【发布时间】:2013-10-08 10:10:41 【问题描述】:

据我所知,大多数 android 教程和示例都依赖于使用 GCM 将数据从服务器发送到 android 设备;并使用 php 脚本和 post/get 方法将数据从设备发送到服务器。

我的一个朋友(没有任何android编程知识的人)简单地问我,为什么我们不能在java中使用Socket类?在传统的 Java 编程中,您使用套接字(IP 地址 + 端口号)来实现类似于 GCM 的功能(单服务器多客户端 - 使用适当的技术可以确保消息不会丢失,就像 gcm 一样)。

这种传统的socket方法也可以在android中实现吗?如果是这样,GCM 和 Sockets 的优缺点是什么?在哪些情况下使用套接字是合适的? 据我所知,Whatsapp 和许多其他应用程序都使用 GCM。有没有使用套接字的应用程序?

P.S:我只是一名 C.S. 学生;如果我的概念在某个地方有错误,请道歉

【问题讨论】:

【参考方案1】:

GCM 也使用套接字。但是,它们由系统管理,因此可以做普通应用程序无法做的事情。通常,对于任何类型的“推送”通知,系统都需要一个长寿命的套接字,而“通知”只是在该套接字上接收到的一些数据。在桌面或服务器等始终连接的机器上实现所有这些并不难,但在移动设备上存在额外的挑战。例如,切换网络 (3GWiFi)、超出范围、保持连接而不让设备一直处于唤醒状态(并在此过程中耗尽电池)。所以是的,你可以使用服务、套接字和你自己的服务器来实现类似的东西,但这在移动设备上并不是微不足道的。

查看http://mqtt.org/ 了解开源实现。

【讨论】:

谢谢 :) 所以基本上它是可能的;但就像现在没有人对整个网站进行硬编码一样,在现实世界中,您总是使用 GCM 而不是套接字。 Whatsapp、Gmail、facebook 等都使用 GCM 对吗? 如果你不想依赖谷歌服务或者在没有谷歌账户的设备上运行,你需要自己实现。 Gmail确实使用GCM,不知道其他的。

以上是关于android 中的 GCM 与 Socket的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上实现 XMPP Server 以及与 GCM 的通信?

android中的两个gcm接收器

GCM中的canonical_id为零 - Android

android中的gcm注册失败

Android 中的推送通知失败,并显示“未设置 GCM 的连接详细信息”

带有PHP的Android中的高优先级GCM消息?