前提
上一篇的注册登录完成以后,就可以开始聊天了
发送聊天信息
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(三)