网络服务器发送命令给J2ME应用程序

3

一个J2ME应用程序是否可以通过来自远程Web服务器的消息被触发?当运行在移动客户端手机上的J2ME应用程序接收到此消息时,我想执行一个任务。我已经了解了HTTP连接,但是我所理解的是它是一种基于客户端的协议,服务器仅会回复客户端请求。有没有任何协议可以让服务器向客户端发送命令而不需要客户端发起任何请求?那TCP或UDP接口如何呢?


1
我这边有一个类似的问题。http://stackoverflow.com/questions/1240503/what-tcp-protocols-are-usable-for-client-to-client-communication 或许当它被回答时,会在某种程度上有所帮助。 - Robin Rodricks
4个回答

3

如果移动设备不允许您建立TCP连接,并且只能使用HTTP请求,则需要实现“长轮询”。

发送一个POST HTTP请求,Web服务器将尽可能长时间地等待(在超时之前),以便回答。如果连接处于空闲状态时有数据到达,则可以直接接收它。如果在长轮询请求之间到达一些数据,则会将其排队,直到请求进来。

如果您可以建立TCP连接,那么只需建立连接并让其保持空闲状态即可。我有icq和irc应用程序,基本上只是坐在那里等待服务器发送一些数据。


我看过的是,MIDP2.0除了HTTP之外,还支持TCP/UDP连接。 使用TCP,我们可以尝试使用Connector.open("socket://ip:port")打开与服务器的连接,其中ip:port分别是服务器的IP地址和端口。 然而,当我尝试使用这段代码连接服务器的80端口时,连接并没有建立成功。它显示未知连接不允许使用该端口。 有任何想法吗? - Kevin Boyd
实际上,错误信息显示“目标端口拒绝不受信任的应用程序”,我不知道如何解决这个错误。 - Kevin Boyd

2

您可以打开套接字连接并在应用程序中实现“隐藏”(或“最小化”)功能。调用此函数以隐藏:

Display.getDisplay(MyMIDlet.instance).setCurrent(null);

循环监听服务器,如果收到消息,则通过从画布调用此函数弹出应用程序:

Display.getDisplay(MyMIDlet.instance).setCurrent(this);

但它并不适用于所有设备。


根据您之前的帖子,不是所有手机ISP都支持套接字连接,他们可能会阻止对手机的传入连接。那么开放HTTP连接如何?但是频繁轮询服务器可能会给用户带来沉重的负担,因为GPRS计费是基于流量的,有什么解决办法吗? - Kevin Boyd
1
不支持套接字连接,PushRegistry不使用套接字,因为在这种情况下,服务器需要直接将数据推送到移动设备。<br> 但是,当您打开套接字连接并保持打开状态时,一切都应该正常工作-我自己尝试过,并且一些应用程序(如j2me的GMail)使用它。 - Pavel Alexeev

2

您应该看到PushRegistry功能,可以向特定号码发送短信,当手机接收到该短信时,应用程序将启动并进行所需的HTTP连接或其他操作。但是,它的缺点是您可能需要签署应用程序才能使其在设备上工作,您还需要一个SMS聚合器,例如SMSLibKannel


我已经进入了PushRegistry功能,短信是其中之一的选项,但是如果套接字或HTTP连接足够的话,我宁愿朝这个方向发展。看起来pushregistry也支持网络连接,我只想尝试一下这些选项,直到我找到最佳方案。 - Kevin Boyd

1

J2ME支持Socket推送。 但是,只有在您的服务器能够将数据传递到您的手机时,它才能正常工作。很可能运营商网关不允许这样做。 如果您的手机具有静态外部IP地址,则可能是可能的 - 一些运营商可以提供此服务以获得一定费用。


我认为在阅读了所有答案之后,HTTP连接和长轮询是可行的方式,关于套接字推送存在很多不确定性,而且我不知道有多少服务提供商允许手机接收入站连接,可能会阻止它们。 我希望有更好的答案来证明我是错误的。 - Kevin Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接