Server to Client通信方法

时间:2014-09-11 18:58:13

标签: java android spring long-polling retrofit

我不认为我的问题是原创的,也许我已经有了答案,但我觉得有点迷失。

我有一个存在的android框(客户端)并从服务器检索信息,然后显示该信息。客户端每隔一秒就调用一次服务器,以检查信息是否有变化。现在这没关系,但是当我们有500个客户端每秒一次点击服务器时,这将开始变得沉重。

问题: 通信方式是否有相反的方式发生。我希望服务器告诉客户端何时有更新而不是客户端到服务器。

我们目前正在使用KDubb的Retrofit并且沟通工作很好,但我认为它不会实现我们正在寻找的目标,或者它会不会实现?我知道你可以做异步通信,但我不知道客户端地址,因为它位于某个地方(家庭或企业)的本地网络上,我不希望客户担心防火墙或路由器问题

Long Polling会完成我所描述的内容吗?是否有其他技术可以比长时间轮询更好地工作,还是会根据我的想法进行改造?

我正在使用Spring平台,我们正在与Android通信。

3 个答案:

答案 0 :(得分:0)

如果你想从服务器端推送,你的另一个选择就是打开Socket连接。然而,如果你走这条路线,听起来就像每秒500次查询一样,你可能有更多的连接要管理。我对你的要求一无所知,但从你的“500次点击/秒”,我认为长时间的民意调查可能是最佳选择

答案 1 :(得分:0)

轮询肯定是更新客户端的低效方式。您应该考虑使用Websockets(对于Android Websocket客户端库,只需Google“WebSockets Android”)。使用Websockets,您的服务器将能够在需要时异步更新基于Websocket的客户端应用程序。还有一种安全形式的WebSocket协议(wss://),如果您担心传输数据的安全性,可以使用它。

答案 2 :(得分:0)

经过大量测试后,我发现GCM(Google Cloud Messaging)是我应用程序的最佳选择。它使用XMPP并且非常快。 Google不会限制您可以来回发送的邮件数量,但是您需要在Android端启用Google Play服务。我目前正在使用spring,我需要使用这些库。

<dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-core</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-extensions</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-debug</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-resolver-javax</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-tcp</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-jingle</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>

这是使用Maven,我相信我的项目中已经包含了一些不在此列表中的其他内容。在我添加这些库之后,Google提供的代码段here几乎不需要修改。

长轮询会有效,所以会有套接字。然而,随着连接数量的增加,我们决定打开许多连接是一个坏主意,这就是我们搬到GCM的原因。

似乎没有很多关于使用带GCM的弹簧的例子,所以这里有一些我找到的链接。 https://code.google.com/p/gcm/source/browse/#git%2Fgcm-server%253Fstate%253Dclosed

http://www.grokkingandroid.com/xmpp-server-google-cloud-messaging/ https://github.com/writtmeyer/gcm_server/tree/master/src/com/grokkingandroid/sampleapp/samples/gcm/ccs/server

http://hmkcode.com/android-google-cloud-messaging-tutorial/

警告。 GCM似乎没有弹簧好。 XMPP可以作为服务单独安装sprig,但它不使用Google帮助您的代码。如果您发现此信息有误,我欢迎不同的答案。