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<>();//jiddataMap.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(三)