从J2ME客户端轮询HTTP服务器

时间:2009-08-08 18:46:26

标签: java http java-me mobile polling

我在我的手机(客户端)上运行了一个J2ME应用程序,

我想打开与服务器的HTTP连接,并继续轮询服务器上的更新信息。

所执行的每次轮询都会耗尽GPRS字节,从长远来看会变得昂贵,因为GPRS计费基于发送和接收的数据包。 是否有使用HTTP协议进行轮询的字节有效方式?

我也听说过长时间的民意调查,但我不确定它是如何运作的,效率如何。

实际上,优先考虑的方法是服务器告诉手机应用程序新数据已准备就绪,这样就不需要进行轮询,但是我不知道这些技术,特别是在J2ME中。

4 个答案:

答案 0 :(得分:6)

如果您只想使用HTTP解决此问题,long polling将是最好的方法。这很容易。首先,您需要在服务器端设置URL以进行通知(例如http://example.com/notify),并定义通知协议。协议可以像一些文本行一样简单,每行都是一个事件。例如,

  MSG user1
  PHOTO user2 album1
  EMAIL user1
  HEARTBEAT 300

手机上的投票主题就是这样,

  1. 建立与通知网址的HTTP连接。在J2ME中,您可以使用GCF HttpConnection。
  2. 如果没有要推送的事件,服务器将阻止。
  3. 如果服务器响应,则获取每一行并生成一个新线程以通知应用程序并回送到#1。
  4. 如果连接因任何原因而关闭,请暂停一段时间并返回步骤1.
  5. 您必须注意以下实施细节,

    1. 在客户端和服务器上调整HTTP超时。超时越长,效率越高。超时连接将导致重新连接。
    2. 在手机和服务器上启用HTTP keepalive。 TCP的三次握手在GPRS术语中很昂贵,所以尽量避免使用它。
    3. 检测陈旧连接。在移动环境中,很容易获得陈旧的HTTP连接(连接已经消失,但轮询线程仍在等待)。您可以使用心跳恢复。说心跳率是5分钟。服务器应每5分钟发送一次通知。如果没有要推送的数据,只需发送HEARTBEAT即可。在电话上,如果5分钟内没有收到任何内容,则轮询线程应该尝试关闭并重新打开轮询连接。
    4. 仔细处理连接错误。当存在连接问题时,长轮询不能很好地工作。如果处理不当,它可能是交易破坏者。例如,如果睡眠时间不够,您可以在步骤4中浪费大量数据包。如果可能,请检查手机上的GPRS可用性,并在无法使用GPRS时将轮询线程置于保持状态。
    5. 如果未正确实施,服务器成本可能会非常高。例如,如果使用Java servlet,则每个正在运行的应用程序将至少具有一个相应的轮询连接及其线程。根据用户的数量,这可以快速杀死Tomcat :)您需要使用资源有效的技术,如Apache Mina。
    6. 我被告知还有其他更有效的方法可以将通知推送到手机,例如使用短信和一些IP级别的技巧。但是你要么必须做一些低级别的非便携式编程,要么遇到专利侵权的风险。使用仅HTTP解决方案,长轮询可能是最好的。

答案 1 :(得分:2)

我不确切地说“轮询”是什么意思,你的意思是IMAP IDLE吗? 连接保持打开状态,并且一次又一次地建立连接本身没有开销。如上所述,另一种可能的解决方案是HTTP请求的HEAD标头(忘了,谢谢!)。

请查看此tutorial以获取J2ME中HTTP连接的基础知识。

无法在没有Push Support的情况下将数据推送到应用程序/设备(如Blackberry)。

答案 2 :(得分:1)

HEAD HTTP request是HTTP提供的方法,如果您想检查页面是否已更改,浏览器和代理服务器会使用它来检查页面是否已更新,而不会占用大量带宽

在HTTP术语中,HEAD请求与没有正文的GET相同,我假设如果您的民意调查不是很频繁,那么最多只有几百个字节可以接受。

答案 3 :(得分:1)

执行此操作的最佳方法是使用套接字连接。像GMail这样的许多应用都使用它们。