在最近一个新的项目里面要用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; } }把聊天室的操做以及各类事件监听器放到下一章。