基于Openfire Smack开发即时通讯应用、获取离线消息,发送消息,联系人列表,添加好友(三)

一:前面两篇说了Openfire服务器的搭建和注册登录,接下来就是重点了,实现与好友之间的聊天。

二:获取用户的所有好友

XMPPTCPConnection connection

    /** * 获得所有联系人 */
    public Roster getContact() {
        Roster roster = Roster.getInstanceFor(connection);
        //获得所有的联系人组
        Collection<RosterGroup> groups = roster.getGroups();
        for (RosterGroup group : groups) {
            //获得每个组下面的好友
            List<RosterEntry> entries = group.getEntries();
            for (RosterEntry entry : entries) {
                //获得好友基本信息
                entry.getUser();
                entry.getName();
                entry.getType();
                entry.getStatus();
            }
        }
        return roster;
    }

三:由于Smack没有提供获取历史聊天记录的Api(本人一直没有找到)所以对于聊天记录、聊天列表这一块需要自己设计数据库用来保存聊天信息;我这里就对一些重点的Api方法进行整理。

  1. 用户一上线获取离线消息,注意:要获取离线消息需要在获取XMPPTCPConnection时将登录状态设置为离线不然获取不到
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                        //....
                        //设置登录状态
                        .setSendPresence(false)
                         //....
             XMPPTCPConnection  connection = new XMPPTCPConnection(config);
  1. 获取离线消息
    /** * 一上线获取离线消息 * 设置登录状态为在线 */
    private void getOfflineMessage() {
        OfflineMessageManager offlineManager = new OfflineMessageManager(connection);
        try {
            List<Message> list = offlineManager.getMessages();
            //删除离线消息
            offlineManager.deleteMessages();
            //将状态设置成在线
            Presence presence = new Presence(Presence.Type.available);
            connection.sendStanza(presence);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

四:发送一条消息,可以使用之前安装的Spark进行测试了

 try {
            ChatManager manager =  ChatManager.getInstanceFor(connection);
            Chat chat =  manager.createChat("[email protected]",null);
            chat.sendMessage("HelloWord");
        } catch (SmackException.NotConnectedException e) {
            e.printStackTrace();
        }

manager.createChat(userJID, null); userJID一定是用户名@服务器ip地址否则无法发出消息

五:既然可以发送消息了,那么当然也可以获取到对方发送给你的消息了。

    /** * 初始化聊天消息监听 */
    public void initListener() {
        ChatManager manager = ChatManager.getInstanceFor(connection);
        //设置信息的监听
        final ChatMessageListener messageListener = new ChatMessageListener() {
            @Override
            public void processMessage(Chat chat, Message message) {
                //当消息返回为空的时候,表示用户正在聊天窗口编辑信息并未发出消息
                if (!TextUtils.isEmpty(message.getBody())) {
                    //message为用户所收到的消息
                }
            }
        };
        ChatManagerListener chatManagerListener = new ChatManagerListener() {

            @Override
            public void chatCreated(Chat chat, boolean arg1) {
                chat.addMessageListener(messageListener);
            }
        };
        manager.addChatListener(chatManagerListener);
    }

六:添加一个好友与好友请求监听

    /** * 添加好友 * * @param user帐号 * @param nickName 昵称 * @param groupName 组名 */
    Roster.getInstanceFor(connection).createEntry("[email protected]", "", null);


    /** * 添加好友请求信息监听 */
    public void addFriendListener() {
        //条件过滤
        StanzaFilter filter = new AndFilter();
        StanzaListener listener = new StanzaListener() {
            @Override
            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
                DiscoverInfo p = (DiscoverInfo) packet;
                //p中可以得到对方的信息
                if (p.getType().toString().equals("subscrib")) {
                    //好友申请
                } else if (p.getType().toString().equals("subscribed")) {
                    //通过了好友请求
                } else if (p.getType().toString().equals("unsubscribe")) {
                    //拒绝好友请求
                }
            }
        };
        connection.addAsyncStanzaListener(listener, filter);
    }

下面就是本人实现的一个大概聊天界面,勉强实现了一个单聊功能。

你可能感兴趣的:(服务器,openfire,smack,聊天,即时通讯)