【问题标题】:XMPP, WebSocket, and other questions [closed]XMPP、WebSocket 和其他问题 [关闭]
【发布时间】:2013-11-25 19:56:22
【问题描述】:

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

现在我主要意识到拥有 WebSocket 服务器的可能性(因为我被介绍为一个 实时 解决方案,它可以为我打开无限的可能性),我之前测试过——看起来不错。但是,我面临以下问题:

  1. 我不知道如何管理在线/离线状态;我必须自己实施吗?如果他的朋友仍然连接,Android 客户端可能每 30 秒查询一次服务器......
  2. 离线消息如何?如果某个特定的人未连接,则消息将不会传递给他。消息是否需要存储在某个地方(比如 MSSQL),然后当用户登录时,客户端会自动从服务器检索所有离线消息?
  3. 群聊呢?我不确定 WebSocket 是如何实现的,我是否也必须单独实现它?这意味着需要处理大量的商业逻辑(以及大量出现错误的空间)......

我知道有一个名为 XMPP 的协议(它与 WebSocket 完全不同),但我不确定它与我的问题有何关系。 XMPP 是我的灵丹妙药吗(即是否有 .NET 库可以为我实现其中的大部分功能?)。我也听说过彗星,但我完全不知道它是什么关系......

有很多缺失的部分,我认为实现我的聊天服务器/客户端将是小菜一碟,但显然并非如此。有经验的人可以给我一些反馈吗?

【问题讨论】:

    标签: android .net websocket xmpp chat


    【解决方案1】:

    让我们按部分进行:

    首先:不要使用套接字。这意味着您需要在每个客户端设备上始终保持服务运行并保持连接。这会像疯了一样耗尽电池,没有人会使用它。这些应用程序(包括 WhatsApp、Hangout、Gmail、Facebook Messenger)中的每一个都使用 Google 云消息传递 (GCM) http://developer.android.com/google/gcm/index.html 服务。

      1234563不会在移动设备中每 30 秒查询一次。
    1. 是的,如果设备未连接,您的服务器必须做这些事情。而且我不相信你会使用 SQL,现在很多公司都在做基于可扩展性的 noSQL 方法,但这不是我的专长。

    2. 我不确定你在这里问什么。您将发送数据的方式与应用程序处理数据的方式混合在一起。这是两个完全不同的东西,学习区别。例如,有人可以创建一个通过 UDP 上的 WiFi-Direct 工作的群聊(这是如何发送数据),但你对这些数据做什么并不重要,它可能已经通过蓝牙到达解析器/解释器也是如此。这只是数据。

    祝你好运。

    【讨论】:

    • 但是一旦用户在最前端运行应用程序,我应该使用 WebSocket 吗?还是我应该主要依靠 GCM 并让 GCM 完成这项工作?
    • 我想知道为什么有人-1这个答案。没有意义。
    • 好答案,只是补充一下,Whats-app 使用 XMPP,如维基百科 en.wikipedia.org/wiki/WhatsApp 上所述。
    • @harvey_slash 他们在没有它的设备上使用了其他东西(很可能每 X 分钟使用“AlarmManager”轮询一次)。您可以在代码中创建一个简单的“if/else”,或者使用 gradle build flavor 为 Google play 和其他 appStores 以不同的方式构建它。重要的一点是,“其他”解决方案将对电池产生更大的影响。
    • @harvey_slash 显然我的回答和你的问题有些混乱。我的大部分答案都集中在应用程序处于后台时,这是重点,因为问题集中在在线/离线状态和持续轮询上。在应用程序处于前台后,我认为 GCM 不是要走的路。 android.stackexchange 的答案也不正确/已过时。我刚刚从 GPlay 下载了 ManifestViewer,我可以向您保证 WhatsApp 拥有 c2dm 权限。
    【解决方案2】:

    您可以并且应该将 WebSocket 用于状态和即时消息功能。事实上,即时通讯就是 WebSocket 世界的“Hello world”示例。

    此外,WebSocket 标准旨在支持更高级别、更丰富的业务协议(具有讽刺意味的是,该标准称为子协议)。 XMPP 就是这样的协议之一,并且有几种实现具有您正在寻找的确切功能。

    如果您想尝试一下,Kaazing(我工作的公司)有一个free download 可用。它包含一个开源 XMPP 服务器 (OpenFire),以及预配置 Kaazing WebSocket 网关的 XMPP 版本。 Kaazing 所做的是将 XMPP 协议通过 WebSocket 扩展到 Web 客户端。它这样做是透明的,因此从 XMPP 服务器的角度来看,您的(浏览器)客户端只是另一个 XMPP 客户端。

    另一个很好的资源是The Definitive Guide to HTML5 WebSocket(我是其中的合著者)的第 4 章,标题为Building Instant Messaging and Chat over WebSocket with XMPP。这本书还附带了一个free downloadable VM,其中预装了开源软件并为您的测试进行了配置。虚拟机的Here you can see detailed screencasts - 了解一下。

    希望这会有所帮助。

    【讨论】:

    • 但他的问题是关于 Android 的。它是一种移动设备,可以在 Edge、3G、LTE 或 WiFi 网络上运行(所有这些网络都具有不同程度的电池消耗),这些网络连接有一个电池,它决定了用户可以使用该设备多长时间.您指向的整个服务器端可能非常好且正确。但是在移动设备上使用永远在线的连接是很糟糕的。
    • @Budius 插座不会自行耗尽电池电量。异步套接字不会消耗太多电池。
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多