基于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("azhon@10.104.179.23",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("azhon@10.104.179.23", "", 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);
    }

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

这里写图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code-Porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值