XMPP、WebSocket及其他问题

6

我现在的目标是制作一个具有WhatsApp功能的Android应用程序(不一定是WhatsApp的克隆,只需具有类似的、也许不太好的功能)。我认为重要的是群聊、在线/离线状态以及离线消息。

目前我主要了解到可以使用WebSocket服务器(因为它被介绍为可以打开无限可能性的实时解决方案),我之前也做过测试——看起来很不错。然而,我面临以下问题:

  1. 我不知道如何管理在线/离线状态;我是否需要自己实现?也许Android客户端每30秒向服务器查询他的朋友是否仍然连接着......
  2. 离线消息怎么办?如果某个人没有连接,消息将不会发送给他。那么消息是否需要存储在某个地方(比如MSSQL),当该人登录时,客户端会自动从服务器检索所有离线消息?
  3. 群聊怎么办?我不确定WebSocket如何实现这一点,我是否需要单独实现?这意味着要处理大量的业务逻辑(并且有很多错误可能出现)......

我知道有一个叫做XMPP的协议(它与WebSocket完全不同),但我不确定它如何与我的问题相关。XMPP是否是我的救命稻草(即是否有.NET库可以为我实现大部分功能?)。我也听说过Comet,但我不知道它有什么关系......

还有很多缺失的部分,我以为实现我的聊天服务器/客户端会很简单,但显然并不是这样。有没有一点经验的人给我一些反馈?

2个回答

4
您可以并且应该使用WebSocket来实现在线状态和即时通讯功能。事实上,即时通讯是WebSocket世界中的“Hello world”示例。
此外,WebSocket标准旨在支持更高级、更丰富的业务协议(具有讽刺意味的是,标准称之为子协议)。XMPP就是这样的协议,而且有许多实现可以提供您所需的确切功能。
如果您想尝试一下,Kaazing(我工作的公司)提供免费下载。它包含一个开源的XMPP服务器(OpenFire),以及预配置的Kaazing WebSocket网关的XMPP版本。Kaazing将XMPP协议扩展到WebSocket上的Web客户端。它通过透明的方式实现,因此从XMPP服务器的角度来看,您的(浏览器)客户端只是另一个XMPP客户端。
另一个好的资源是《HTML5 WebSocket权威指南》第四章(我是其中的合著者),标题为使用XMPP构建WebSocket即时消息和聊天。该书还附带有免费可下载的虚拟机,预先安装并配置了开源软件供您测试。在此处,您可以查看详细的屏幕录像以了解其情况。
希望这可以帮到您。

但他的问题是关于Android的。这是一种移动设备,可以在Edge、3G、LTE或WiFi网络上运行(所有这些网络都有不同程度的电池耗尽),它附带了一个电池,决定用户能够使用设备的时间长度。也许你指向的整个服务器端非常好和正确。但在移动设备上使用始终连接是不好的。 - Budius
@Budius 一个套接字本身不会消耗电池。异步套接字的电池消耗也不会太大。 - SHM

3

让我们一步一步来:

首先:不要使用sockets。这意味着您需要在每个客户端设备上保持一个服务运行并维护连接。这会使电池电量急剧下降,没有人会使用它。包括WhatsApp、Hangout、Gmail和Facebook messenger在内的所有应用程序都使用Google云消息传递(GCM)http://developer.android.com/google/gcm/index.html服务。

  1. 也许您想在状态更改时通过GCM发送这些状态,或者一旦用户进入好友列表屏幕,您可以进行一次性查询以获取状态,重要的是您不会在移动设备上每30秒查询一次。

  2. 是的,如果设备没有连接,您的服务器必须完成相关工作。我不相信您会使用SQL,现在许多公司正在使用noSQL方法进行扩展性处理,但这不是我的专长。

  3. 我不确定您在问什么。您混淆了如何发送数据和应用程序如何处理数据。这是两件完全不同的事情,请学会区分。例如,有人可以创建一个组聊天,该聊天通过WiFi-Direct over UDP工作(这是数据将被发送的方式),但您对这些数据的处理方式并不重要,它们可以通过蓝牙到达,对于解析器/解释器来说都是相同的。这只是数据。

祝你好运。


但是一旦用户在前台运行应用程序,我应该使用WebSocket吗?还是应该主要依赖GCM并让GCM完成工作? - matt
我想知道为什么有人给这个答案点了-1。毫无道理。 - Budius
1
好的回答,只是补充一下,Whats-app使用XMPP,如在维基百科上所述http://en.wikipedia.org/wiki/WhatsApp。 - Ricky Boyce
1
@harvey_slash 他们在没有这个功能的设备上使用其他方法(很可能是每隔X分钟使用“AlarmManager”进行轮询)。你可以在代码中简单地使用“if/else”语句,或者使用Gradle构建风格来为Google Play和其他应用商店构建不同的版本。重要的是,“其他”解决方案对电池的影响更大。 - Budius
1
@harvey_slash 看来我的回答和你的问题有些混淆了。我的大部分回答都集中在应用程序在后台运行时,因为问题关注的是在线/离线状态和持续轮询。当应用程序处于前台时,我认为GCM不是正确的选择。此外,android.stackexchange的答案是错误/过时的。我刚从GPlay下载了ManifestViewer,我可以保证WhatsApp拥有c2dm权限。 - Budius
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接