一:前面两篇说了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方法进行整理。
- 用户一上线获取离线消息,注意:要获取离线消息需要在获取XMPPTCPConnection时将登录状态设置为离线不然获取不到
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
//....
//设置登录状态
.setSendPresence(false)
//....
XMPPTCPConnection connection = new XMPPTCPConnection(config);
- 获取离线消息
/**
* 一上线获取离线消息
* 设置登录状态为在线
*/
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);
}