smack是什麼?具體百度一下。我的理解也不深,我理解其實就是XMPP協議的實現。都是浮雲,一切都是工具。
首先還是下載smack,我下載的是smack_3_2_0.tar。這個包裏有四個jar文件。
首先創建一個java工程。創建一個lib文件夾,把這四個jar包放到lib中,添加到編譯路徑中。
目錄接口如下:
怎麼圖片還還沒傳上來。哎。
創建一個TestSmack.java類。具體代碼如下:
package org.yangzc.smack;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Packet;
public class TestSmack {
public static void main(String[] args) throws XMPPException {
ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);
XMPPConnection connection = new XMPPConnection(config);
XMPPConnection.DEBUG_ENABLED = true;
connection.connect();
connection.login("admin", "admin");
// ChatManager chatManager = connection.getChatManager();
// chatManager.addChatListener(new ChatManagerListener(){
// @Override
// public void chatCreated(Chat chat, boolean arg1) {
// chat.addMessageListener(new MessageListener(){
// @Override
// public void processMessage(Chat arg0, Message arg1) {
// System.out.println(arg1.getBody());
// }
// });
//
// }
// });
connection.addPacketListener(new PacketListener(){
@Override
public void processPacket(Packet arg0) {
System.out.println(arg0);
}
}, new PacketFilter(){
@Override
public boolean accept(Packet arg0) {
return true;
}
});
IQ iq = new IQ(){
@Override
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<query xmlns=\"com:im:group\"/>");
return buf.toString();
}
};
connection.sendPacket(iq);
// Chat chat = chatManager.createChat("yangzc", new MessageListener(){
// @Override
// public void processMessage(Chat arg0, Message arg1) {
// System.out.println(arg1.getBody());
// }
// });
// chat.sendMessage("hello World!!!");
// BufferedReader cmdIn = new BufferedReader(new InputStreamReader(System.in));
// for(;;) {
// try {
// String cmd = cmdIn.readLine();
// if("!q".equalsIgnoreCase(cmd)) {
// break;
// }
// chat.sendMessage(cmd);
// }catch(Exception ex) {
// }
// }
connection.disconnect();
System.exit(0);
}
}
測試:啓動openfire服務端,添加插件到openfire中。運行這個例子。可以看到,smack和openfire的插件通信成功。
總結:
這裏比較關鍵的一句話時是:buf.append("<query xmlns=\"com:im:group\"/>");這句話指定了這個消息是發動到那個命名空間中。
只有發送到openfire插件對應的命名空間中openfire插件纔可以正確接收。
當初在這裏費了好大的功夫。至此openfire插件和smack的通信實現算是告一段落。剩下的工作就是xml了,不用說了吧,很簡單的。
明天寫什麼呢?應該在研究一下androidpn。簡單看了一眼,好像是android領域的服務器推送。推動就那些吧,推推拉拉的。