Smack文檔(翻譯)


Contents:

  • 概要
  • 入門指南
  • 管理連接
  • 信息基礎
  • 角色與狀態
  • 處理數據包
  • 服務架構
  • 包屬性
  • 調試Smack
  • 隱匿
  • Smack擴展手冊

概要:

Smack 是一個與XMPP服務器進行實時通訊的客戶端庫,包括即時信息與聊天組。

Smack優勢

 

  • 易於使用且功能強大的API與用戶通訊可以在只有幾行代碼
  • View Code
    Connection connection = new XMPPConnection("jabber.org");
    connection.connect();
    connection.login("mtucker", "password");
    Chat chat = connection.getChatManager().createChat("jsmith@jivesoftware.com", new MessageListener() {

    public void processMessage(Chat chat, Message message) {
    System.out.println("Received message: " + message);
    }
    });
    chat.sendMessage("Howdy!");
  • 像其他類庫中一樣,不強迫你在包中編碼,提供了更智能的結構如 ChatRoster讓你的程序更有效
  • 不需要你熟悉XML格式
  • 提供簡單的點對點通信Smack可以每個消息中設置一些的屬性包括屬性,對象

  • 開放源碼這意味着你可以將它用到你的商業或非商業應用中。

關於XMPP

XMPP(可擴展消息存在協議是一個開放的協議標准支持和擴展協議標准基礎譯://www.xmpp的。

如何使用本文檔

 

假設你已經熟悉即時通訊的主要特點那么也強烈建議你打開文檔程序指南和使用作為參考通過閱讀本文檔

入門指南:

本文檔將向你介紹提供了一個重要的類別和概念

所需的JAR文件

Smack可以很方便的在JDK1.5或更高版本的應用中使用,它不依賴外部包(除語音聊天),並且盡可能小,文件提供更多的靈活性功能應用要求

  • smack.jar -- 提供核心功能,是必須的庫所有功能的一部分,包括協議
  • smackx.jar --在標准基礎上支持更多的擴展xeps定義包括多用戶聊天文件傳輸用戶搜索擴展記錄
  • smackx-debug.jar --增強的圖形用戶界面的調試協議啟用了調試它會自動發現路徑。

建立一個連接

xmppconnection類是用來創建一個服務器連接下面是示例代碼

View Code
// Create a connection to the jabber.org server.
Connection conn1 = new XMPPConnection("jabber.org");
conn1.connect();

// Create a connection to the jabber.org server on a specific port.
ConnectionConfiguration config = new ConnectionConfiguration("jabber.org", 5222);
Connection conn2 = new XMPPConnection(config);
conn2.connect();

注意,使用到服務器的默認安全連接連接(可能時)包括使用協議加密connectionconfiguration類提供了先進的控制建立連接連接管理詳細,如能夠禁用或要求加密

一旦創建了連接你可以使用用戶名和密碼登陸連接。登錄字符串用戶名密碼方法一旦登錄后,可以與其他用戶創建的對象聊天

名冊Roster工作

Roster可以讓你跟蹤存在的其他用戶用戶可以組織成組如“朋友”“同事”然后你可以發現每個用戶是否在線或離線

getroster()方法獲得名冊連接Roster類可以讓你找到所有Roster實體,他們所屬的群體目前每個實體的存在狀態

讀取和寫入數據包

每個到XMPP服務器的消息從客戶端被稱為數據包和發送數據org.jivesoftware.smack.packet包中包含封裝三種不同的基本類型所允許類(message, presence, and IQ),

聊天、群聊等,提供了更高層次的結構,自動管理創建和發送數據,也可以直接創建和發送數據包下面是一個代碼示例來改變你的存在,人們知道不可用與離線。

View Code
// 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 Connection instance called "con").
con.sendPacket(presence);

Smack提供2種不同方式讀取傳入的數據包,PacketListener,  PacketCollector,以及packetfilter的使用情況,確定哪些數據包應處理。一個數據包偵聽器在不同的編程中使用。你可以投遞和禁止操作結果隊列中的信息包收集器。因此,當傳遞信息包或者等待特定的數據包,包收集器也是非常有用的 。包監聽器以及收集器可以在一個連接中被創建。

管理連接:
 org.jivesoftware.smack.Connection 類提供了到XMPP服務器的連接管理。默認實現的是 org.jivesoftware.smack.XMPPConnection類.有2個主要構造函數,一個是XMPPConnection(String)

連接參數服務器名稱將使用所有默認連接設置

  • DNS查找確切的服務器駐留地址和端口(一般為5222
  • 如果有必要,設置服務器協商協議包括加密的安全連接將回到較低的安全設置

  • 名為"Smack" 的XMPP 資源將用於連接。

另外您可以使用xmppserverconnectionconfiguration構造函數指定連接設置這些設置包括

  • 手動指定服務器地址和端口服務器,而不是使用DNS查找

  • 啟用連接壓縮
  • 自定義安全設置標記連接要求加密連接點

  • 指定一個連接資源名稱 "Work" 或 "Home".每個到服務器連接的用戶必須有一個獨特的資源名稱. 用戶 "jsmith@example.com", 詳細資源地址可能是"jsmith@example.com/Smack". 作為唯一的資源名,用戶可以從多個地點使用多個設備登錄到服務器優先級值與每個資源將確定哪些特定的連接接收郵件地址("jsmith@example.com" 在例子中).

連接和斷開

View Code
// Create the configuration for this new connection
ConnectionConfiguration config = new ConnectionConfiguration("jabber.org", 5222);
config.setCompressionEnabled(true);
config.setSASLAuthenticationEnabled(true);

Connection connection = new XMPPConnection(config);
// Connect to the server
connection.connect();
// Log into the server
connection.login("username", "password", "SomeResource");
....
// Disconnect from the server
connection.disconnect();

使用 ConnectionConfiguration#setReconnectionAllowed(boolean) 來開關這種特性,將默認重新嘗試連接以防突然斷開。重新連接管理將立刻連接到服務器和在嘗試連接失敗時增加延遲。

如果你想重新等待下一個連接,你可以使用 Connection#connect()一個新的嘗試將被建立。如果手動嘗試也沒有用,那么連接管理器將繼續連接工作。
信息基礎

即時通訊的核心是來回發送消息,雖然個別郵件可以來回發送消息包,但一般容易處理的字符串信息聊天是使用org.jivesoftware.smack.chat類。

Chat

一個聊天對應創建新線程的消息(使用一個線程ID下面的代碼段演示如何創建一個新的用戶聊天然后發送文本消息

View Code
// Assume we've created a Connection 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");
}

Chat字符串)方法是一種方便的方法創建一個消息對象設置body使用字符串參數來發送消息,在這種情況下使用Chat.createMessage() 與 Chat.sendMessage(Message) 方法如下面的代碼片段

View Code
Message newMessage = new Message();
newMessage.setBody("Howdy!");
message.setProperty("favoriteColor", "red");
newChat.sendMessage(newMessage);

上面的例子中我們指定一個messagelistener當創建一個Chat。監聽器隨時更新聊天記錄,下面代碼使用一個監聽器作為parrot-bo

View Code
 // 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());
}

Incoming Chat

聊天是另一個用戶發起開始接收聊天訊息,如不是顯式創建一個聊天或發送郵件您需要創建並注冊chatmanager chat實例

chatmanager已經找到一個匹配的聊天線程ID)如果存在它將創建一個新的來匹配。這個新的Chat你必須注冊並通知它,你可以注冊消息監聽器來接受信息並處理。

View Code
// Assume we've created a Connection name "connection".
ChatManager chatmanager = connection.getChatManager().addChatListener(
new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally)
{
if (!createdLocally)
chat.addMessageListener(new MyNewMessageListener());;
}
});

除了基於線程的聊天信息,有一些客戶不發送一個線程的一部分,處理這種情況正好將嘗試匹配傳入的消息,找到最適合現有的Chat基於JID。它會嘗試找到一個相同的全JID,如果沒有找到,則會使用基本的JID,如果沒有發現新的,用戶可以創建新的Chat.

角色與狀態:














免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM