一:前面两篇说了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() {@Overridepublic void processMessage(Chat chat, Message message) {//当消息返回为空的时候,表示用户正在聊天窗口编辑信息并未发出消息if (!TextUtils.isEmpty(message.getBody())) {//message为用户所收到的消息}}};ChatManagerListener chatManagerListener = new ChatManagerListener() {@Overridepublic 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() {@Overridepublic 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);}