smack和openfire通信的简单例子
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(){@Overridepublic void processPacket(Packet arg0) {System.out.println(arg0);}}, new PacketFilter(){@Overridepublic boolean accept(Packet arg0) {return true;}});IQ iq = new IQ(){@Overridepublic 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领域的服务器推送。推动就那些吧,推推拉拉的。