smack和openfire通訊的簡單例子

iteye_778發表於2011-06-21

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領域的伺服器推送。推動就那些吧,推推拉拉的。

相關文章