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

标签 java android wcf long-polling instant-messaging

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

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

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

我在实现这个方法时遇到了一些问题:

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

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

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

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

任何想法都会有所帮助。

最佳答案

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

What is the best way to know the status of the user

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

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

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

希望这对您有所帮助。

关于java - 使用长轮询实现android聊天模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13192407/

相关文章:

java - Android - 可绘制路径

c# - 使 DataContract 中的 DataMember 使用隐式转换为字符串运算符

java - 有没有办法在 Play! 中即时更改 Oracle 连接?框架?

java - Spring Boot 测试无法解决存储库依赖关系

java - 与 App Engine 兼容的 JDBC 连接池

android - Flutter:在应用程序关闭或在后台时运行 native Android 代码

java - 子类如何在双胞胎设计模式中进行交流?

android - 获取android中用户的语言

c# - 集合接口(interface)和 WCF

javascript - 如何使用 ASP.Net、WCF 服务和客户端 session 知道客户端已断开连接并仅清理与 SQL Server 断开连接的客户端的表数据?