• Xmpp获取离线消息


    文章只是选取了其中一段,无XMPP基础的人可能看起来有点复杂;

    假设我们注册了一个用户,用户名叫shimiso,那么我们如何让shimiso这个用户一登陆就取到离线消息呢?

    PPConnection.DEBUG_ENABLED = false;
        AccountManager accountManager;
        final ConnectionConfiguration connectionConfig = new ConnectionConfiguration(
            "192.168.1.78", Integer.parseInt("5222"), "csdn.shimiso.com");
     
        // 允许自动连接
        connectionConfig.setReconnectionAllowed(true);
        connectionConfig.setSendPresence(false);//不要告诉服务器自己的状态
        Connection connection = new XMPPConnection(connectionConfig);
        try {
          connection.connect();// 开启连接
          accountManager = connection.getAccountManager();// 获取账户管理类
        } catch (XMPPException e) {
          throw new IllegalStateException(e);
        } 
        connection.login("shimiso", "123","SmackTest"); 
        OfflineMessageManager offlineManager = new OfflineMessageManager(
            connection);
        try {
          Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager
              .getMessages();
     
          System.out.println(offlineManager.supportsFlexibleRetrieval());
          System.out.println("离线消息数量: " + offlineManager.getMessageCount());
     
          Map<String, ArrayList<Message>> offlineMsgs = new HashMap<String, ArrayList<Message>>();
     
          while (it.hasNext()) {
            org.jivesoftware.smack.packet.Message message = it.next();
            System.out
                .println("收到离线消息, Received from 【" + message.getFrom()
                    + "】 message: " + message.getBody());
            String fromUser = message.getFrom().split("/")[0];
     
            if (offlineMsgs.containsKey(fromUser)) {
              offlineMsgs.get(fromUser).add(message);
            } else {
              ArrayList<Message> temp = new ArrayList<Message>();
              temp.add(message);
              offlineMsgs.put(fromUser, temp);
            }
          }
     
          // 在这里进行处理离线消息集合......
          Set<String> keys = offlineMsgs.keySet();
          Iterator<String> offIt = keys.iterator();
          while (offIt.hasNext()) {
            String key = offIt.next();
            ArrayList<Message> ms = offlineMsgs.get(key);
     
            for (int i = 0; i < ms.size(); i++) {
              System.out.println("-->" + ms.get(i));
            }
          }
     
          offlineManager.deleteMessages();
        } catch (Exception e) {
          e.printStackTrace();
        }
        offlineManager.deleteMessages();//删除所有离线消息
        Presence presence = new Presence(Presence.Type.available);
                    nnection.sendPacket(presence);//上线了
                    nnection.disconnect();//关闭连接

    运行结果:

    这里我们需要特别当心的是先不要告诉openfire服务器你上线了,否则永远也拿不到离线消息,用下面老外的话将就是在你上线之前去获取离线消息,这么设计是很有道理的。

    The OfflineMessageManager helps manage offline messages even before the user has sent an available presence. When a user asks for his offline messages before sending an available presence then the server will not send a flood with all the offline messages when the user becomes online. The server will not send a flood with all the offline messages to the session that made the offline messages request or to any other session used by the user that becomes online.

    同时拿到离线消息以后删除离线消息offlineManager.deleteMessages();,同是通知服务器自己上线了。

    https://blog.csdn.net/kazeik/article/details/44344609

  • 相关阅读:
    C++ primer plus读书笔记——第6章 分支语句和逻辑运算符
    C++ primer plus读书笔记——第7章 函数——C++的编程模块
    C++ primer plus读书笔记——第5章 循环和关系表达式
    C++ primer plus读书笔记——第4章 复合类型
    C++ primer plus读书笔记——第3章 处理数据
    C++ primer plus读书笔记——第2章 开始学习C++
    10款好用到爆的Vim插件,你知道几个?
    程序员最讨厌的100件事,瞬间笑喷了,哈哈~~
    20 个最常用的 Git 命令用法说明及示例
    史上最全的Nginx配置参数中文说明
  • 原文地址:https://www.cnblogs.com/tiancai/p/10072641.html
Copyright © 2020-2023  润新知