使用长轮询实现android聊天模块

时间:2012-11-02 09:19:03

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

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

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

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

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

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

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

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

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

    任何想法都会有所帮助。

1 个答案:

答案 0 :(得分:2)

我没有使用过GCM,但我在移动设备上有很多消息传递应用程序的经验,所以会尝试解释我们遵循的内容。

  
    

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

  

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

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

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

  3. 希望这有帮助。