在最近一個新的項目裏面要用openfire不少的自帶功能,好比:加好友,加聊天室,發消息,發送文件,獲取組消息,更新狀態等。雖然用c++開發,可是先用java實現一下。smack能夠說把openfire有設計的那些交互協議都封裝的很完整,在消息服務器,其實很好實現各類功能,說到底就是協議的定義,openfire本身定義了這幾種協議來實現這些功能,smack把這些協議封裝成對應的對象去處理,讓開發者更容易上手。 java
public boolean sendMessage(String toJid,String content){ Message message = new Message(); message.setFrom(connectManager.getJid()); message.setTo(toJid); message.setBody(content); message.setType(Message.Type.chat); message.setSubject(MSG_SUBJECT);//消息主題 BaseInfo baseInfo = new BaseInfo(); baseInfo.setRecvName("接收人"); baseInfo.setSendName("發送人"); message.addExtension(baseInfo);//消息包的擴展 return connectManager.sendPacket(message); }擴展包的java:
import org.jivesoftware.smack.packet.PacketExtension; public class BaseInfo implements PacketExtension{ private String sendName; private String recvName; public String getRecvName() { return recvName; } public void setRecvName(String recvName) { this.recvName = recvName; } public String getSendName() { return sendName; } public void setSendName(String sendName) { this.sendName = sendName; } public String getElementName() { return "base_info"; } public String getNamespace() { return "uc:staff_name"; } <span style="white-space:pre"> </span>//重寫xml方法 public String toXML() { StringBuilder buf = new StringBuilder(); buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append( "\">"); if (getSendName() != null) { buf.append("<send_name>").append(getSendName()).append("</send_name>"); } if (getRecvName() != null) { buf.append("<rec_name>").append(getRecvName()).append("</rec_name>"); } buf.append("</").append(getElementName()).append(">"); return buf.toString(); } }
/** * 修改狀態 * @param state * @return */ public boolean sendPresence(String state){ return sendPresence(state, null); } /** * 針對某人修改狀態 * @param state * @param toJid * @return */ public boolean sendPresence(String state,String toJid){ Presence.Type type = Presence.Type.available; Presence.Mode mode =null; String status =null; if("1".equals(state)){ mode = Presence.Mode.chat; status = "空閒"; }else if("2".equals(state)){ mode = Presence.Mode.xa; status="離開一段時間"; }else if("3".equals(state)){ mode = Presence.Mode.away; status="離開"; }else if("4".equals(state)){ mode = Presence.Mode.dnd; status="正忙"; }else if("5".equals(state)){ type = Presence.Type.unavailable; status = "隱身"; }else{ return false; } Presence presence = new Presence(type); presence.setTo(toJid); presence.setMode(mode); presence.setStatus(status); return connectManager.sendPacket(presence); }
/** * 返回全部組信息 * @return List(RosterGroup) */ public List<RosterGroup> getGroups() { List<RosterGroup> groupsList = new ArrayList<RosterGroup>(); Collection<RosterGroup> rosterGroup = roster.getGroups(); Iterator<RosterGroup> i = rosterGroup.iterator(); while (i.hasNext()){ RosterGroup group = i.next(); groupsList.add(group); log.debug("獲取組信息:name:"+group.getName()); } return groupsList; } /** * 返回相應(groupName)組裏的全部用戶 * * @return List(RosterEntry) */ public List<RosterEntry> getEntriesByGroup(String groupName) { List<RosterEntry> EntriesList = new ArrayList<RosterEntry>(); RosterGroup rosterGroup = roster.getGroup(groupName); if(rosterGroup !=null){ Collection<RosterEntry> rosterEntry = rosterGroup.getEntries(); Iterator<RosterEntry> i = rosterEntry.iterator(); while (i.hasNext()){ RosterEntry entry = i.next(); EntriesList.add(entry); log.debug("獲取好友信息:name:"+entry.getName()+",status:"+entry.getStatus()+",group:"+entry.getGroups()+",type:"+entry.getType()+",user:"+entry.getUser()); } } return EntriesList; } /** * 返回全部用戶信息 * * @return List(RosterEntry) */ public List<RosterEntry> getAllEntries() { List<RosterEntry> EntriesList = new ArrayList<RosterEntry>(); Collection<RosterEntry> rosterEntry = roster.getEntries(); Iterator<RosterEntry> i = rosterEntry.iterator(); while (i.hasNext()){ RosterEntry entry = i.next(); EntriesList.add(entry); log.debug("獲取好友信息:name:"+entry.getName()+",status:"+entry.getStatus()+",group:"+entry.getGroups()+",type:"+entry.getType()+",user:"+entry.getUser()); } return EntriesList; }
/** * 添加一個好友無分組 */ public boolean addUser(String userName,String name) { try { roster.createEntry(userName, name, null); return true; } catch (Exception e) { log.error("添加一個好友無分組異常",e); return false; } } /** * 添加一個好友到分組 * @param roster * @param userName * @param name * @return */ public boolean addUser(String userName,String name,String groupName) { try { roster.createEntry(userName, name,new String[]{groupName}); return true; } catch (Exception e) { log.error("添加一個好友到分組異常",e); return false; } } /** * 刪除一個好友 * @param roster * @param userName * @return */ public boolean removeUser(String userName){ try { RosterEntry entry = roster.getEntry(userName); roster.removeEntry(entry); log.debug("刪除一個好友:"+entry.getName()); return true; } catch (Exception e) { log.error("刪除一個好友異常",e); return false; } }把聊天室的操做以及各類事件監聽器放到下一章。