Android studio使用smack連接xmpp服務(wù)器收發(fā)消息

我使用的是ejabberd16.09的linux版本铣缠,安裝教程網(wǎng)上有很多,我在這里只介紹一下android端連接昆禽、登錄和收發(fā)消息的方法蝗蛙。文章最后附上了我寫的一個demo,歡迎大家參考为狸。
ejabberd官網(wǎng)地址:點(diǎn)擊打開鏈接
進(jìn)入正題歼郭,我使用的是smack4.1.2包,需要在android studio的build.gradle文件中加入

compile ("org.igniterealtime.smack:smack-android-extensions:4.1.2") {  
    exclude group: 'xpp3', module: 'xpp3'  
}  
compile ("org.igniterealtime.smack:smack-android:4.1.2") {  
    exclude group: 'xpp3', module: 'xpp3'  
}  
// Optional for XMPPTCPConnection  
    compile ("org.igniterealtime.smack:smack-tcp:4.1.2") {  
exclude group: 'xpp3', module: 'xpp3'  
}  
// Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)  
compile ("org.igniterealtime.smack:smack-im:4.1.2") {  
    exclude group: 'xpp3', module: 'xpp3'  
}  

點(diǎn)擊 "Sync Project with Gradle Files"按鈕即可將smack4.1.2引入項(xiàng)目中

下面介紹連接和登錄的方法辐棒,并帶有監(jiān)聽收到消息的方法

 private XMPPTCPConnection con;  
 private Runnable XmppThread = new Runnable(){  
    @Override  
    public void run() {  
        boolean tag = false;  
        XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();  
        config.setHost("192.168.26.38");              //設(shè)置ejabberd主機(jī)IP  
        config.setServiceName("h.com");         //設(shè)置ejabberd服務(wù)器名稱  
        config.setPort(5222);                   //設(shè)置端口號:默認(rèn)5222  
        config.setUsernameAndPassword("admin", "111111");    //設(shè)置用戶名與密碼  
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);      //禁用SSL連接  
        config.setSendPresence(true);  
        config.setDebuggerEnabled(true);  
        con = new XMPPTCPConnection(config.build());  
        try {  
            con.connect();  
            tag = con.isConnected();  
            Roster roster = Roster.getInstanceFor(con);  
            try {  
                con.login();  
                Log.e("TAG", "login sucess!!");  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            //         設(shè)置聊天監(jiān)聽器病曾,監(jiān)聽聊天消息  
            ChatManager chatm = ChatManager.getInstanceFor(con);  
            chatm.addChatListener(new ChatManagerListener() {  
                @Override  
                public void chatCreated(Chat chat, boolean b) {  
                    if (!b) {           //不是本地創(chuàng)建的會話  
                        chat.addMessageListener(new ChatMessageListener() {  
                            @Override  
                            public void processMessage(Chat chat, Message message) {  
                                Log.d("PushTest", message.toString());  
                                Log.d("PushTest", message.getType().toString());  
                                Log.d("PushTest", message.getExtension("extension").toString());  
                                Log.d("PushTest", message.getExtension("extension").getNamespace());  
                                Log.d("PushTest", message.getExtension("extension").getElementName());  
                                DefaultExtensionElement defaultExtensionElement = message.getExtension(  
                                        ELEMENT_NAME,NAME_SPACE);  
                                String name = defaultExtensionElement.getValue("name");  
                                String url = defaultExtensionElement.getValue("url");  
                                Log.d("PushTest", name);  
                                Log.d("PushTest", url);  
                            }  
                        });  
                    }  
                }  
            });  

        } catch (Exception e) {  
            Log.e("TAG", "connect failed!" + e.toString());  
            e.printStackTrace();  

        }  
        if(tag){  
            handler.sendEmptyMessage(0x00);  
        }else{  
            handler.sendEmptyMessage(0x01);  
        }  
    }  
};  

其中的

DefaultExtensionElement defaultExtensionElement = message.getExtension(  
      ELEMENT_NAME,NAME_SPACE);  
String name = defaultExtensionElement.getValue("name");  
String url = defaultExtensionElement.getValue("url");  

是我在服務(wù)端發(fā)送消息時加的Message的屬性拓展,定義如下:

import org.jivesoftware.smack.packet.ExtensionElement;  

public class Received implements ExtensionElement  {  
{  
  
    private static final String NAME_SPACE = "extension";  
    private static final String ELEMENT_NAME = "userinfo";  
  
    //用戶姓名元素名稱  
    private String nameElement = "name";  
    //用戶姓名元素文本(對外開放)  
    private String nameText = "";  

    //用戶地址元素名稱  
    private String urlElement = "url";      
    //用戶地址元素文本(對外開放)  
    private String urlText = "";  

    @Override  
    public String getElementName() {  
        return ELEMENT_NAME;  
    }  

    @Override  
    public String getNamespace() {  
        return NAME_SPACE;  
    }  

    @Override  
    public CharSequence toXML() {  
        StringBuilder sb = new StringBuilder();  

        sb.append("    <").append(ELEMENT_NAME).append(" xmlns=\"").append(NAME_SPACE).append("\">");  
        sb.append("<" + nameElement + ">").append(nameText).append("</"+nameElement+">");  
        sb.append("<" + urlElement + ">").append(urlText).append("</"+urlElement+">");  
        sb.append("</"+ELEMENT_NAME+">");  

        return sb.toString();  
    }  

    public String getNameText() {  
        return nameText;  
    }  

    public void setNameText(String nameText) {  
        this.nameText = nameText;  
    }  

    public String getUrlText() {  
        return urlText;  
    }  

    public void setUrlText(String urlText) {  
        this.urlText = urlText;  
    }  
}  

使用時的方法如下:

    ChatManager chatm = ChatManager.getInstanceFor(mXmppConnection);  
    Chat chat = chatm.createChat("ly@h.com", new ChatMessageListener() {        //創(chuàng)建與ly的會話  
        public void processMessage(Chat chat, Message message) {  
            System.out.println("Received message: " + message);  
        }  
        });  
        try {  
            /** 
             * 發(fā)送一條消息給ly 
             */  
            Received received = new Received();  
            received.setNameText(name);  
                Message message = new Message();  
                message.setBody(context);  
                message.setTo("ly@h.com");  
                message.setFrom("gqw@h.com");  
                message.addExtension(received);  
                chat.sendMessage(message);  

        } catch (SmackException.NotConnectedException e) {  
            e.printStackTrace();  
        }  

我寫了一個小demo漾根,歡迎大家指出不足之處!
Android使用smack連接ejabberd服務(wù)器注冊泰涂、收發(fā)消息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辐怕,隨后出現(xiàn)的幾起案子逼蒙,更是在濱河造成了極大的恐慌,老刑警劉巖寄疏,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是牢,死亡現(xiàn)場離奇詭異,居然都是意外死亡陕截,警方通過查閱死者的電腦和手機(jī)驳棱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來农曲,“玉大人社搅,你說我怎么就攤上這事。” “怎么了形葬?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵合呐,是天一觀的道長。 經(jīng)常有香客問我笙以,道長淌实,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任源织,我火速辦了婚禮翩伪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈息。我一直安慰自己缘屹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布侠仇。 她就那樣靜靜地躺著轻姿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逻炊。 梳的紋絲不亂的頭發(fā)上互亮,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音余素,去河邊找鬼豹休。 笑死,一個胖子當(dāng)著我的面吹牛桨吊,可吹牛的內(nèi)容都是我干的威根。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼视乐,長吁一口氣:“原來是場噩夢啊……” “哼洛搀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佑淀,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤留美,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伸刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎砾,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年捧颅,在試婚紗的時候發(fā)現(xiàn)自己被綠了棺榔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡隘道,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谭梗,我是刑警寧澤忘晤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站激捏,受9級特大地震影響设塔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜远舅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一闰蛔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧图柏,春花似錦序六、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至裁着,卻和暖如春繁涂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背二驰。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工扔罪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桶雀。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓矿酵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親背犯。 傳聞我的和親對象是個殘疾皇子坏瘩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容