【问题标题】:How to effectively use persistent XMPP with android如何在 android 中有效地使用持久 XMPP
【发布时间】:2015-07-27 16:06:55
【问题描述】:

我想开发一个即时通讯应用程序。 GCM,用于推送数据是一种流行(且有效)的方式,如果你在 android 上,但由于以下原因我没有使用它:

  1. 它会删除 100 多条未送达的消息。
  2. 它不适用于没有谷歌应用的设备。

相反,我决定设置一个传统的 XMPP 服务器 (openFire),并使用 Smack api(TCP 连接)进行连接。到目前为止,一切进展顺利,但我有一些担忧。

这是我写的一个小测试代码(它在服务中运行):

    Log.d("TAG","service has started");
        SmackConfiguration.setDefaultPacketReplyTimeout(10000);
        XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                .setUsernameAndPassword("admin", "football100")
                .setServiceName("harsh-pc")
                .setHost("192.168.0.200")
                .setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                .build();

        final AbstractXMPPConnection conn2 = new XMPPTCPConnection(config);
        try {
            conn2.connect();

            conn2.login();

            Presence presence = new Presence(Presence.Type.available);
            presence.setStatus("online");
            // Send the packet (assume we have an XMPPConnection instance called "con").
            conn2.sendStanza(presence);

        } catch (SmackException | IOException | XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("TAG", e.toString());
        }
StanzaFilter filter=new StanzaFilter() {
    @Override
    public boolean accept(Stanza stanza) {
        return true;
    }
};
        StanzaListener listener= new StanzaListener() {
            @Override
            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
                Log.d("TAG","recevied stuff");
                ChatManager chatmanager = ChatManager.getInstanceFor(conn2);


                Chat newChat = chatmanager.createChat("harsh@harsh-pc");
                newChat.sendMessage("Reply :) ");
            }
        };

        conn2.addAsyncStanzaListener(listener,filter);
        ChatManager chatmanager = ChatManager.getInstanceFor(conn2);


        Chat newChat = chatmanager.createChat("harsh@harsh-pc");

        try {
            Random r=new Random();

               // newChat.sendMessage(Integer.toString(r.nextInt()));
            Thread.sleep(1500);


            }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("TAG",e.toString());
        }
    }
}).start();


final Thread sleeper=new Thread(new Runnable() {
    @Override
    public void run() {
        for(;;){
            try {
                Thread.sleep(100000);
                Log.d("TAG","SLEEPI");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});sleeper.start();

注意这个 sn-p 的最后一部分。 我必须运行一个无限循环,以便我可以继续侦听传入的数据包(如果我不包含此代码,我将无法拦截任何传入的数据包)。

我的问题是:

  1. 这种方法会消耗大量电池吗?
  2. 此方法会阻止设备休眠吗?
  3. 有没有更好的方法来完成任务(不使用 GCM)?
  4. 有没有办法将 GCM 与 OPENFIRE 集成?

【问题讨论】:

    标签: java android push-notification xmpp


    【解决方案1】:

    过去我们也有同样的需求,我们在应用程序中提供了一个外部聊天功能,为此我们使用了 XMPP [使用 aSmack],

    很高兴知道您已经确定需要使用外部服务才能与服务器建立持久性 xmpp 连接,但请确保服务应该是后台服务并使其成为粘性服务。

    使用 GCM 或 XMPP 实际上取决于您如何设计系统,您可以在应用程序中同时使用它们,以使其更稳定并导致更复杂!!!!!!

    制作如此复杂的系统仍然遥遥无期,您始终可以使用简单的解决方案,即 XMPP。

    这种方法会消耗大量电池吗? 不应该!!!因为您在这里使用默认的 ping 间隔(即 实际上30分钟),它不应该消耗更多的电池。如果你用过 ping 间隔小于 5 分钟,那么你应该担心电池 排水问题!!!

    这种方法会阻止设备进入睡眠状态吗? 根据我的理解,您在这里使用 TCP 连接,除非输入流设备上没有数据可以进入睡眠状态,只要 一些数据到达设备将被唤醒,或者您在同一设备上发送一些数据 套接字 [例如心跳/ping] 以保持 cpu 唤醒。但仍然如此 行为可能会因不同的移动制造商而异。

    有没有更好的方法来完成工作(不使用 GCM)? XMPP 始终是 gcm 的强大替代品,只要您知道什么 您真的在寻找吗?您可以随时尝试优化您的系统 用于连击输出。

    有没有办法将 GCM 与 OPENFIRE 集成? 我在这里很困惑你真正想在这里问什么! gcm(CCS) 是 XMPP 服务器的 google 实现 你总是可以创建一个 XMPP 客户端使用 smack 但将 GCM 与 Openfire 集成意味着您是 查看服务器到服务器的通信,这超出了范围 根据我的理解你的申请要求!!!!

    以下是一些有用的链接,可以帮助您进行研究

    Should applications using aSmack use foreground Services?

    How to keep a XMPP connection stable on Android with (a)smack?

    How To Create Service In Android Which Makes Persist Xmpp Connection With XMPP Server?

    Keep XMPP connection (using asmack) alive on Android

    【讨论】:

    • 当我说“与 openfire 集成”时,我的意思是:如果应用程序未打开,并且有消息到达,openfire 将通过 GCM 发送消息。如果应用启动了,那么就会建立一个socket连接,直接和xmpp服务器对话
    • 我认为您正在寻找 Openfire 中的自定义 servlet 插件,请参阅此链接 1.community.igniterealtime.org/thread/50919 2.community.igniterealtime.org/thread/47895
    • 请注意,我自己从未使用过这样的插件,因为我使用过 XMPP 的离线消息功能xmpp.org/extensions/xep-0160.html,如果 openfire 检测到接收用户处于离线状态,则使用此功能实现它会存储消息并离线传递所有消息接收用户上线后立即发送消息并发送出席信息[在线/可用]。
    • 是的,我知道这一点,但由于它是一个 android 应用程序,我想在向客户端发送消息后立即发送通知。
    • @Dev 我想要与服务器的持久连接你能帮我吗?
    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 2011-02-20
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多