【问题标题】:Implementing android chat module using long polling使用长轮询实现 android 聊天模块
【发布时间】:2012-10-22 22:41:24
【问题描述】:

我正在编写一个 Android 应用,其中包含一个聊天模块。我已经选择使用长轮询来实现聊天。

因为我试图避免耗尽用户手机电池,所以我考虑在实现中添加一个 GCM 消息平台来通知设备新消息。

这个想法是在用户在他的屏幕上打开应用程序时使用长轮询,这样参与实时聊天会很快并且不涉及发送大量 GCM 消息,而在空闲时,服务器会知道用户当前未进行轮询,并将在有新消息到达时向设备发送 GCM 消息以将其唤醒。

我正在努力解决实施此方法的一些问题:

  1. 了解用户状态的最佳方式是什么 - 他是现在轮询还是等待推送消息将其唤醒。我应该将应用设置为在进入睡眠状态时通知服务器还是让服务器自行检测?

  2. 如果我将其设置为应用程序将通知服务器何时在模式之间切换,如果此通知未通过,我该如何恢复。 (当客户端正在等待 gcm 并且服务器认为它正在轮询并且不会发送一个..)

  3. 我遇到了一些情况,客户端在轮询,服务器即使收到新消息也没有响应。也许客户端不知道服务器上的某种超时......如果这是一个错误,我会修复它,但是如果客户端认为它正在轮询而服务器不知道它,我该怎么办(请求的超时时间太长,无法等待下一次轮询)。

我的客户端是原生 Android,Web 服务是 WCF (C#)。

任何想法都会有所帮助。

【问题讨论】:

  • 您的问题写得很好,但有一些问题可能会导致很难在 SO 上获得答案。你在一个问题上提出三个不同的问题。此外,它非常开放,与通常首选的更实际的“可回答”问题相反(问“我应该......”不是很容易回答,所有答案都必须以“取决于”开头)。这也使您的问题非常“本地化”(即非常针对您的情况)。
  • 也许您可以将其拆分为三个问题,并努力使它们不那么开放、可回答且尽可能不本地化。
  • 考虑过将其拆分为 1 个以上的问题,但所有部分都指向同一个问题 - 移动应用程序的即时消息协议实现。因为每个问题都取决于所有其他答案,所以我选择将其全部写成一个大问题。

标签: java android wcf long-polling instant-messaging


【解决方案1】:

我没有使用过 GCM,但我在移动设备上使用过许多消息传递应用程序,因此我将尝试解释我们遵循的内容。

了解用户状态的最佳方式是什么

首先 - 当应用程序在前面时进行长轮询并不是接收即时消息的最佳方式。您需要保持 tcp 连接打开才能立即接收! (希望您的通知也应该包含该消息)任何类型的轮询都将确保您浪费电池并且不会收到 instant 消息。 其次 - 我认为客户端应该通知服务器其状态(前景/背景),以便服务器知道如何响应。 所以我的建议是对 CIR 使用 TCP 套接字,并在后台使用 poll 作为备份(以防服务器丢失“客户端转到后台消息”)

  1. 要恢复使用长轮询(10 分钟)从服务器获取更新并通知服务器您的状态。

  2. 如果您使用我提到的方法(使用 tcp 套接字),只要连接处于活动状态,服务器就应该知道您的应用程序处于前台。此外,服务器应始终使用增量更新来响应轮询(您的轮询应在服务器上次发送内容时发送)

希望这会有所帮助。

【讨论】:

  • app在前时的长轮询是因为我想使用HTTP进行轮询。保持从移动应用程序到远程服务器的 TCP 连接打开并不是那么简单,这就是我采用 jabber 协议(gtalk、whatsup、facebook)工作方式的原因。
  • 服务器始终保留发送给客户端的最后一个消息 ID,因此它只能发送增量更新。并且在每个会话的第一次登录中,客户端能够修改此计数器以恢复它可能丢失的消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2015-03-05
  • 2012-11-06
  • 1970-01-01
  • 2013-08-14
  • 2015-02-23
  • 2011-02-27
相关资源
最近更新 更多