繼續上一章,這裏講述監聽器,在openfire的開發過程當中監聽器是一個很重要的部分。在消息的交互工程中,監聽器起到了觸發事件給開發者。 java
1.一個最簡單的IQ包的監聽器: apache
PacketTypeFilter packetTypeFilter = new PacketTypeFilter(IQ.class); connectManager.getConnection().addPacketListener(new PacketListener(){ public void processPacket(Packet packet) { System.out.println(packet.toXML()); } },packetTypeFilter);//監聽iq包set類型
不過在日常開發過程當中,能夠使用smack裝門針對一些特殊事件都提供了裝門的監聽器類和事件給開發者,這樣編程能夠面向對象,更好的區分出消息的來源。 編程
2.鏈接的監聽器 this
會提供鏈接的狀況給開發者,有斷開鏈接,異常斷開,從新鏈接。smack在異常斷鏈的時候會自動去重連。 spa
connectManager.getConnection().addConnectionListener(ucConnectionListener);
線程
public class UcConnectionListener implements ConnectionListener { private Logger log = FileLogger.getLogger(); private UcManager ucManager; public UcConnectionListener(UcManager ucManager) { this.ucManager = ucManager; } public void connectionClosed() { log.error("正常斷開鏈接"); ucManager.handleDisConnectEvent(ucManager.getConnectManager().getNode()); if (ucManager.getConnectManager().isConnected()){ ucManager.disConnect(); ucManager.connect(); if(ucManager.getConnectManager().isConnected()){ ucManager.handleConnectEvent(ucManager.getConnectManager().getNode()); } } } public void connectionClosedOnError(Exception e) { log.error("由於異常斷開鏈接", e); ucManager.handleDisConnectEvent(ucManager.getConnectManager().getNode()); } public void reconnectingIn(int seconds) { log.error("重連,秒數:" + seconds); } public void reconnectionSuccessful() { log.error("重連成功"); ucManager.handleConnectEvent(ucManager.getConnectManager().getNode()); } public void reconnectionFailed(Exception e) { log.error("重連失敗", e); }
chatManager = connectManager.getConnection().getChatManager(); chatManager.addChatListener(ucChatManagerListener); package ecc.openfire.uc.listener; import org.apache.log4j.Logger; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.packet.Message; import com.telthink.util.FileLogger; import ecc.openfire.uc.UcManager; public class UcChatManagerListener implements ChatManagerListener { private Logger log=FileLogger.getLogger(); private UcManager ucManager; public UcChatManagerListener(UcManager ucManager) { this.ucManager = ucManager; } public void chatCreated(Chat chat, boolean createdLocally) { chat.addMessageListener(new MessageListener() { public void processMessage(Chat chat, Message message) { log.debug("普通聊天,收到消息" + message.toXML()); String from = message.getFrom(); String body = message.getBody(); ucManager.handleChatMessagEvent(from,body); } }); } }
roster = connectManager.getConnection().getRoster(); roster.addRosterListener(ucRosterListener); package ecc.openfire.uc.listener; import java.util.Collection; import org.apache.log4j.Logger; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.util.StringUtils; import com.telthink.util.FileLogger; import ecc.openfire.uc.UcManager; public class UcRosterListener implements RosterListener{ private Logger log=FileLogger.getLogger(); private UcManager ucManager; public UcRosterListener(UcManager ucManager){ this.ucManager = ucManager; } public void entriesAdded(Collection<String> addresses) { log.debug("添加新的好友:"+addresses); } public void entriesDeleted(Collection<String> addresses) { log.debug("刪除的好友:"+addresses); } public void entriesUpdated(Collection<String> addresses) { log.debug("變化的好友:"+addresses); } public void presenceChanged(Presence presence) { String from = StringUtils.parseName(presence.getFrom()); String to = StringUtils.parseName(presence.getTo()); String status = presence.getStatus(); Presence.Type type = presence.getType(); log.debug("好友狀態變化Presence changed:"+from+":"+status+":"+type+",to:"+to); if(from.equals(to)){ ucManager.handleOwnerStatusEvent(from, status, type.toString()); }else{ ucManager.handleFriendStatusEvent(from,status,type.toString()); } } }
5.聊天室的各類事件監聽器 debug
MultiUserChat muc = new MultiUserChat(connectManager.getConnection(), roomName+"@conference."+connectManager.getDomain()); //添加消息監聽 muc.addMessageListener(new UcGroupChatManagerListener(this)); //添加其餘聊天室人員狀態變化監聽 muc.addParticipantStatusListener(new UcParticipantStatusListener(this,roomName)); //添加直接在聊天室的狀態變化監聽 muc.addUserStatusListener(new UcUserStatusListener(this,roomName)); //添加邀請被拒絕的監聽 muc.addInvitationRejectionListener(new UcInvitationRejectionListener(this,roomName));
package ecc.openfire.uc.listener; import org.apache.log4j.Logger; import org.jivesoftware.smackx.muc.ParticipantStatusListener; import com.telthink.util.FileLogger; import ecc.openfire.uc.UcManager; public class UcParticipantStatusListener implements ParticipantStatusListener { private Logger log=FileLogger.getLogger(); private UcManager ucManager; private String roomName; public UcParticipantStatusListener(UcManager ucManager,String roomName) { this.ucManager = ucManager; this.roomName = roomName; } public void adminGranted(String participant) { log.debug(participant + "授予管理員權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"授予管理員權限"); } public void adminRevoked(String participant) { log.debug(participant + "移除管理員權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"移除管理員權限"); } public void banned(String participant, String actor, String reason) { log.debug(participant + "禁止加入房間(拉黑,不知道怎麼理解,呵呵)"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"禁止加入房間"); } public void joined(String participant) { log.debug(participant + "加入了房間"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"加入房間"); } public void kicked(String participant, String actor, String reason) { log.debug(participant + "被踢出房間"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"被踢出房間"); } public void left(String participant) { log.debug(participant + "離開房間"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"離開房間"); } public void membershipGranted(String participant) { log.debug(participant + "授予成員權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"授予成員權限"); } public void membershipRevoked(String participant) { log.debug(participant + "成員權限被移除"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"成員權限被移除"); } public void moderatorGranted(String participant) { log.debug(participant + "授予主持人權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"授予主持人權限"); } public void moderatorRevoked(String participant) { log.debug(participant + "移除主持人權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"移除主持人權限"); } public void nicknameChanged(String participant, String newNickname) { log.debug(participant + "暱稱變化"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"暱稱變化:"+newNickname); } public void ownershipGranted(String participant) { log.debug(participant + "授予全部者權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"授予全部者權限"); } public void ownershipRevoked(String participant) { log.debug(participant + "移除全部者權限"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"移除全部者權限"); } public void voiceGranted(String participant) { log.debug(participant + "被批准發言了!"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"被批准發言了"); } public void voiceRevoked(String participant) { log.debug(participant + "被禁言了!"); ucManager.handleMucParticPantStatusEvent(roomName,participant,"被禁言了"); } }監聽器的編寫的時候,儘可能用smack已經有的,只有實在找不到了再去用那些過濾器集來拼裝過濾到咱們想要的消息。