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领域的服务器推送。推动就那些吧,推推拉拉的。