博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openfire smack包
阅读量:6118 次
发布时间:2019-06-21

本文共 5473 字,大约阅读时间需要 18 分钟。

hot3.png

在最近一个新的项目里面要用openfire很多的自带功能,比如:加好友,加聊天室,发消息,发送文件,获取组消息,更新状态等。虽然用c++开发,但是先用java实现一下。smack可以说把openfire有设计的那些交互协议都封装的很完整,在消息服务器,其实很好实现各种功能,说到底就是协议的定义,openfire自己定义了这几种协议来实现这些功能,smack把这些协议封装成对应的对象去处理,让开发者更容易上手。

1.发消息:

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";	}	//重写xml方法	public String toXML() {		StringBuilder buf = new StringBuilder();        buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append(            "\">");        if (getSendName() != null) {            buf.append("
").append(getSendName()).append("
"); } if (getRecvName() != null) { buf.append("
").append(getRecvName()).append("
"); } buf.append("
"); return buf.toString(); }}

2.修改状态

/**	 * 修改状态	 * @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);	}

3.对Roster中好友组的操作

/**      * 返回所有组信息      * @return List(RosterGroup)      */      public List
getGroups() { List
groupsList = new ArrayList
(); Collection
rosterGroup = roster.getGroups(); Iterator
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
getEntriesByGroup(String groupName) { List
EntriesList = new ArrayList
(); RosterGroup rosterGroup = roster.getGroup(groupName); if(rosterGroup !=null){ Collection
rosterEntry = rosterGroup.getEntries(); Iterator
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
getAllEntries() { List
EntriesList = new ArrayList
(); Collection
rosterEntry = roster.getEntries(); Iterator
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; }
4.对Roster好友的操作
/**      * 添加一个好友无分组      */      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;          }                }
把聊天室的操作以及各种事件监听器放到下一章。

转载于:https://my.oschina.net/u/1261308/blog/386622

你可能感兴趣的文章
正则表达式
查看>>
Unix/Linux下删除Oracle控制文件Controlfile为什么实例Instance没有立即奔溃?
查看>>
泄露门年终盘点:***用户网站间的“罗生门”
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
如何对网站进行归档
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Mindjet MindManager 2019使用教程:
查看>>
游戏设计的基本构成要素有哪些?
查看>>
详解 CSS 绝对定位
查看>>
AOP
查看>>
我的友情链接
查看>>
打印服务自动停止
查看>>
linux--ab压力测试详解
查看>>
C++模板之typename和class关键字的区别
查看>>
Nginx 代理 jira 和 confluence
查看>>
图形界面
查看>>
【HDU】6012 Lotus and Horticulture (BC#91 T2)
查看>>