重要鏈接網址
Asmack github地址:
https://github.com/Flowdalic/asmack
源碼jar下載地址
http://asmack.freakempire.de/
XMPP
http://xmpp.org/
Openfire smack地址
http://www.igniterealtime.org/smack文檔
http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html
簡單代碼操作參考
http://www.cnblogs.com/not-code/archive/2011/07/16/2108369.html
(——以下內容為smack文檔的個人部分翻譯以及見解,考慮到本人英語并不是很好,寫這篇文章僅僅作為記錄,如果有翻譯錯誤的請指正,共同進步,謝謝)
Getting Started
Configuration
Smack的初始化涉及到2個步驟
1 初始化系統(tǒng)屬性——通過SmackConfiguration進行系統(tǒng)屬性初始化。這些屬性可以通過getxxx()方法獲取
2 初始化啟動類——初始化類意味著在啟動時候實例化該類,如果繼承SmackInitializer則需要調用initialize()方法。如果不繼承SmackInitializer則初始化的操作必須在靜態(tài)代碼塊中,一旦加載類時自動執(zhí)行
Establishing a Connection創(chuàng)建連接
XmppTCPConnection類是被用來創(chuàng)建連接到xmpp服務器的
- // Create a connection to the jabber.org server._
- XMPPConnection conn1 = new XMPPTCPConnection("jabber.org");
- conn1.connect();
-
- // Create a connection to the jabber.org server on a specific port._
- ConnectionConfiguration config = new ConnectionConfiguration("jabber.org", 5222);
- XMPPConnection conn2 = new XMPPTCPConnection(config);
- conn2.connect();
ConectionConfiguration類提供一些控制操作,譬如是否加密。
Working with the Roster 花名冊
Roster可以讓你保持獲取其他用戶的presence狀態(tài)
用戶可以添加進組“Friend”或者“Co-workers”,你可以知曉用戶是否在線
檢索roster可以通過XMPPConnection.getRoster()方法,roster類允許你查看所有的roster enteries ,群組信息當前的登錄狀態(tài)
Reading and WritingPackets 讀寫數據包
XMPP服務器和客戶端間以XML傳遞的信息被稱為數據包。
org.jivesoftware.smack.packet包內有三種封裝好的基本的packet,分別是message,
presence和IQ。
比如Chat和GroupChat類提供了更高級別的結構用以創(chuàng)建發(fā)送packet,當然你也可以直接用packet。
- // Create a new presence. Pass in false to indicate we're unavailable._
- Presence presence = new Presence(Presence.Type.unavailable);
- presence.setStatus("Gone fishing");
- // Send the packet (assume we have a XMPPConnection instance called "con").
- con.sendPacket(presence);
Smack提供兩種讀取packets
PacketListener 和PacketCollector
這兩種都通過PacketFilter進行packet加工
A packet listener is used for event style programming, while a packet collector has a result queue of packets that you can do polling and blocking operations on.
(packet listener事件監(jiān)聽,而packet collector是一個packets的可以進行polling和blocking操作的結果集隊列。)
So, a packet listener is useful when you want to take some action whenever a packet happens to come in, while a packet collector is useful when you want to wait for a specific packet to arrive.
(packet listener一旦數據包傳遞抵達的時候你可以進行處理,packet collector則被使用在你需要等待一個指定的packet傳遞抵達時候。)
Packet collectors and listeners can be created using an Connection instance.
(packet listener和packet collector在connection實例中被創(chuàng)建。)
- // Create a packet filter to listen for new messages from a particular
- // user. We use an AndFilter to combine two other filters._
- PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class),
- new FromContainsFilter("mary@jivesoftware.com"));
- // Assume we've created a XMPPConnection name "connection".
-
- // First, register a packet collector using the filter we created.
- PacketCollector myCollector = connection.createPacketCollector(filter);
- // Normally, you'd do something with the collector, like wait for new packets.
-
- // Next, create a packet listener. We use an anonymous inner class for brevity.
- PacketListener myListener = new PacketListener() {
- public void processPacket(Packet packet) {
- // Do something with the incoming packet here._
- }
- };
- // Register the listener._
- connection.addPacketListener(myListener, filter);
Managing Connection
Connect and disConnect
- // Create the configuration for this new connection_
- ConnectionConfiguration config = new ConnectionConfiguration("jabber.org", 5222);
-
- AbstractXMPPConnection connection = new XMPPTCPConnection(config);
- // Connect to the server_
- connection.connect();
- // Log into the server_
- connection.login("username", "password", "SomeResource");
-
- ...
-
- // Disconnect from the server_
- connection.disconnect();
Messaging using ChatChat
org.jivesoftware.smack.Chat
- // Assume we've created a XMPPConnection name "connection"._
- ChatManager chatmanager = connection.getChatManager();
- Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() {
- public void processMessage(Chat chat, Message message) {
- System.out.println("Received message: " + message);
- }
- });
-
- try {
- newChat.sendMessage("Howdy!");
- }
- catch (XMPPException e) {
- System.out.println("Error Delivering block");
- }
-
- Message newMessage = new Message();
- newMessage.setBody("Howdy!");
- message.setProperty("favoriteColor", "red");
- newChat.sendMessage(newMessage);
-
- // Assume a MessageListener we've setup with a chat._
- public void processMessage(Chat chat, Message message) {
- // Send back the same text the other user sent us._
- chat.sendMessage(message.getBody());
- }<span style="color:#ff0000;">
- </span>
incoming Chat
- _// Assume we've created a XMPPConnection name "connection"._
- ChatManager chatmanager = connection.getChatManager().addChatListener(
- new ChatManagerListener() {
- @Override
- public void chatCreated(Chat chat, boolean createdLocally)
- {
- if (!createdLocally)
- chat.addMessageListener(new MyNewMessageListener());;
- }
- });
Roster and Presence
roster entries
包含xmpp地址,備注名,群組(假如該用戶不屬于任何一組,則調用“unfiled entry”)
- Roster roster = connection.getRoster();
- Collection<RosterEntry> entries = roster.getEntries();
- for (RosterEntry entry : entries) {
- System.out.println(entry);
- }
監(jiān)聽roster和presence更改
- Roster roster = con.getRoster();
- roster.addRosterListener(new RosterListener() {
- // Ignored events public void entriesAdded(Collection<String> addresses) {}
- public void entriesDeleted(Collection<String> addresses) {}
- public void entriesUpdated(Collection<String> addresses) {}
- public void presenceChanged(Presence presence) {
- System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
- }
- });
Provider architecture
smack provider是用于解析packet extension 和 IQ xml流的
有兩種類型的provider
IQProvider - parses IQ request into java objects
Extension Provider - parses XML sub-documents attached to packets into PacketExtension instances. By default, Smack only knows how to process a few standard packets and sub-packets that are in a few namespaces such as:
(解析packet的xml子元素到PacketExtension實例中。Smack默認僅知道處理少數的標準packets和少數的指定的namespaces下的子packets)
jabber:iq:auth
jabber:iq:roster
jabber:iq:register
(provider這塊翻譯目前就暫且如此,接著會寫IQ擴展將會提到這個,具體看IQ擴展)