java+smack+openfire即时通讯Im(二)

java+smack+openfire即时通讯Im(二)

前提

上一篇的注册登录完成以后,就可以开始聊天了

发送聊天信息

XMPPTCPConnection  connection = initOpenfireConnect();
connection.login("账号","密码");
ChatManager chatManager = ChatManager.getInstanceFor(connection);
Chat chat = chatManager.createChat("对方的jid(也就是用户名@你的服务器名称)");
Message newMessage = new Message();
newMessage.setBody("hahahahahahah");
chat.sendMessage(newMessage);

这样就可以完成聊天信息发送了,注意,要先登录过后才能发送聊天。但是涉及到文件类型的信息发送,没有找到可实现的方法。所以处理办法是从自己本地服务器做中转。
详情可查看之前的一篇博文:
使用strophe.js连接openfire服务器实现web端即时通讯

获取好友列表

注意:只有双方都同意加好友了,才能获取到。对于未同意添加好友的用户也没找到具体怎么去获取,如果有已经实现的大佬,欢迎指点一下哈。万分感谢!
这里有个地方需要提前准备一下,因为好友的在线状态没有在好友列表里面直接返回,所以需要单独去请求才行。登录你的openfire服务器
用户在线状态插件
要获取用户的在线状态,是需要openfire提供接口的!登录服务器以后,点击插件——有效的插件,然后找到Presence Service这个插件,点击后面的+号进行安装,安装完成以后,进入服务器——服务器设置
服务器配置
记住这个地址,需要用到。下面开始上代码

/***
     *
     * <B>方法名称:</B>openfireGetFriendList<BR>
     * <B>概要说明:</B>通过当前账号信息获取账号的好友信息<BR>
     *
     * @param userName
     * @param password
     * @return void
     *
     * @author ZhangYH
     * @date 2020/4/1 14:07
     */
    public static List<Map<String,Object>> openfireGetFriendList(String userName, String password) {
        List<Map<String,Object>> friendList = new LinkedList<>();
        try {
        	//初始化连接
            XMPPTCPConnection  connection = initOpenfireConnect();
            //登录
            connection.login(userName, password);
            Roster roster = Roster.getInstanceFor(connection);
            //这个判断很重要,如果Roster还没加载完就去获取好友数据的话只能获取到空
            if (!roster.isLoaded()) {
                try {
                    roster.reloadAndWait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            Collection<RosterEntry> rosterEntries = roster.getEntries();
            for(RosterEntry rosterEntry : rosterEntries){
                Map<String,Object> dataMap = new HashMap<>();
                //jid
                dataMap.put("userJid",rosterEntry.getUser());
                if(StringUtils.isEmpty(rosterEntry.getName())){
                	//前端显示的暱称
                    dataMap.put("nickName",rosterEntry.getUser().split("@")[0]);
                }else{
                    dataMap.put("nickName",rosterEntry.getName());
                }
                //通过用户的JID获取用户当前的在线状态
                int status = openfireGetFriendOnlineStatus(rosterEntry.getUser());
                //如果在线状态为0,说明用户不存在,跳过
                if (status == 0) {
                    continue;
                }
                if (status == 1) {
                	//在线
                    dataMap.put("status",1);
                }else{
                	//离线
                    dataMap.put("status",0);
                }
                friendList.add(dataMap);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return friendList;
    }
    /***
     *
     * <B>方法名称:</B>openfireGetFriendOnlineStatus<BR>
     * <B>概要说明:</B>获取用户在线状态<BR>
     *
     * @param userJid
     * @return int
     *
     * @author ZhangYH
     * @date 2020/4/1 16:13
     */
    public static int openfireGetFriendOnlineStatus(String userJid) {
        int shOnLineState = 0;    //-不存在-
        try {
        	//OPENFIRE_PRESENCE_URL就是你服务器配置的获取在线状态的哪儿地址,设置type=xml,如果不设置,地址返回的就是一张服务器默认的在线状态的图片
            String strUrl = OPENFIRE_PRESENCE_URL+"?jid="+userJid+"&type=xml";
            URL oUrl = new URL(strUrl);
            URLConnection  oConn = oUrl.openConnection();
            if(oConn!=null){
                BufferedReader oIn = new BufferedReader(new InputStreamReader(oConn.getInputStream()));
                if(null!=oIn){
                    String strFlag = oIn.readLine();
                    oIn.close();
                    if(strFlag.indexOf("type=\"unavailable\"")>=0){
                    	//通过匹配返回的xml信息,unavailable为不在线
                        shOnLineState = 2;
                    }else if(strFlag.indexOf("type=\"error\"")>=0){
                    	//发生错误,说明用户不存在或发生了其它异常
                        shOnLineState = 0;
                    }else if(strFlag.indexOf("priority")>=0){
                    	//成功的状态
                        shOnLineState = 1;
                    }else{
                        shOnLineState = 1;
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return shOnLineState;
    }

欢迎各位大佬交流指正!

上一篇:java+smack+openfire即时通讯Im(一)
下一篇:java+smack+openfire即时通讯Im(三)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章