Openfire smackパッケージ
最近の新しいプロジェクトではopenfireの多くの持参機能を使用します.例えば、友达を追加したり、チャットルームを追加したり、メッセージを送信したり、ファイルを送信したり、グループメッセージを取得したり、ステータスを更新したりします.c++で開発されていますが、まずjavaで実現してみましょう.smackはopenfireが設計したインタラクティブプロトコルを完全にパッケージ化していると言えるが、メッセージサーバでは、実際には様々な機能を実現している.結局プロトコルの定義であり、openfireは自分でこれらのプロトコルを定義してこれらの機能を実現し、smackはこれらのプロトコルを対応するオブジェクトにパッケージ化して処理し、開発者をより簡単に処理させる.
1.メッセージ:
2.ステータスの変更
3.Rosterの友達グループへの操作
4.Rosterの友達への操作
チャットルームの操作や各種イベントリスナーを次の章に置きます.
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";
}
<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();
}
}
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<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;
}
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;
}
}
チャットルームの操作や各種イベントリスナーを次の章に置きます.