openfire+spark+smack實現即時通訊

最近公司項目需要用到即時通訊功能,經過調研發現openfire+spark+smack可以實現。在網上找了很久,資料都十分有限,即使有些朋友實現了也說的不清不楚。於是決定自己研究,耗時一週的時間實現了文字通訊和文件傳輸的功能。現發帖分享給有需要的朋友,也希望大家能夠把自己的資料都分享出來,不要敝掃自珍。

廢話說夠了,現在開始上乾貨:

1.openfire是什麼?
openfire是一個即時通訊服務器,也稱之爲即時通訊平臺。它是基於XMPP協議的,大家所熟悉的通訊軟件QQ、MSN和Gtalk等等,其中Gtalk就是基於XMPP協議的實現。
在即時通訊中往往因爲需要保存一些狀態或者數據所以不能採用點對點通訊,而是需要搭建服務器來轉發。
下載地址:http://www.igniterealtime.org/downloads/index.jsp
下載完畢以後根據提示安裝、配置,然後訪問所配置的服務器地址上的9090端口即可訪問官方爲我們實現好了的openfire後臺管理系統。

2.spark是什麼?
spark從本質上來說就是一個運行在PC上的java程序,你可以看成是官方爲我們實現好的運行在PC上的客戶端,我們只需要下載使用即可。
(當然如果你項目的需求現有的spark無法滿足,你可以選擇在官方下載spark的源碼,對它進行修改)
下載地址:http://www.igniterealtime.org/downloads/index.jsp

3.smack是什麼?
smack你可以看成是一套封裝好了的用於實現XMPP協議傳輸的API,它是一個非常簡單並且功能強大的類庫,給用戶發送消息只需要三行代碼。
下載地址:http://www.igniterealtime.org/downloads/index.jsp
這裏需要強調一點,我們在android上開發用的其實是移植版的類庫asmack,而asmack現在在網上流傳的版本是有BUG的,在傳輸文件的時候會報空指針異常。我在這個問題上也是耗時最多的,在網上找了許多網友修改過的版本,都不頂用,最後也是在eoe論壇中找到了靠譜的asmack修訂版:
詳見:http://www.eoeandroid.com/thread-186418-1-1.html

好了,讀到這裏,相信你對這套實現思路的一些基本概念已經清楚了,那麼請準備好上面的三板斧,下面就開始寫代碼吧。

文字通訊的重要代碼片段:(請注意更換你自己的服務器地址、用戶名和密碼以及想要訪問的用戶名)

                                                 // 連接參數
                                                ConnectionConfiguration connConfig = new ConnectionConfiguration("192.168.0.1", 5222);
                                                connConfig.setReconnectionAllowed(true);
                                                connConfig.setSecurityMode(SecurityMode.disabled); // SecurityMode.required/disabled
                                                connConfig.setSASLAuthenticationEnabled(false); // true/false
                                                connConfig.setCompressionEnabled(false);
                                                // 配置服務器
                                                XMPPConnection connection = new XMPPConnection(connConfig);
                                                
                                                try {
                                                        // 連接服務器
                                                        connection.connect();
                                                        // 用戶登錄
                                                        connection.login("joe", "123456");
                                                        // 向另一個用戶發出聊天
                                                        Chat chat = connection.getChatManager().createChat("[email protected]/Spark 2.6.3", new MessageListener() {
                                                                // 消息回複函數
                                                                @Override
                                                                public void processMessage(Chat arg0, Message arg1) {
                                                                        
                                                                        System.out.println("Received message: " + arg1.getBody());

                                                                        try
                                                                        {
                                                                                arg0.sendMessage("我已收到");
                                                                        } catch (XMPPException e)
                                                                        {
                                                                                e.printStackTrace();
                                                                        }
                                                                        
                                                                }
                                                        });
                                                        // 發送聊天信息
                                                        chat.sendMessage("Hello!");

文件傳輸的重要代碼片段:(請注意更換你自己的服務器地址、用戶名和密碼以及想要訪問的用戶名)

                                                // 連接參數
                                                ConnectionConfiguration connConfig = new ConnectionConfiguration("192.168.0.1", 5222);
                                                connConfig.setReconnectionAllowed(true);
                                                connConfig.setSecurityMode(SecurityMode.disabled); // SecurityMode.required/disabled
                                                connConfig.setSASLAuthenticationEnabled(false); // true/false
                                                connConfig.setCompressionEnabled(false);
                                                // 配置服務器
                                                XMPPConnection connection = new XMPPConnection(connConfig);

                                                try {
                                                        // 連接服務器
                                                        connection.connect();
                                                        // 用戶登錄
                                                        connection.login("joe", "123456");
                                                        // 準備發送的文件
                                                        File file = new File(PATH);

                                                        FileTransferManager transferManager = new FileTransferManager(
                                                                        connection);
                                                        OutgoingFileTransfer outgoingFileTransfer = transferManager
                                                                        .createOutgoingFileTransfer("[email protected]/Spark 2.6.3");
                                                        // 發送文件
                                                        outgoingFileTransfer.sendFile(file, file.getName());

                                                        // 接收文件監聽
                                                        transferManager
                                                                        .addFileTransferListener(new FileTransferListener() {

                                                                                public void fileTransferRequest(
                                                                                                FileTransferRequest request) {
                                                                                        try {
                                                                                                // 接收文件
                                                                                                IncomingFileTransfer transfer = request
                                                                                                                .accept();
                                                                                                // 接收文件存放的位置
                                                                                                transfer.recieveFile(new File(PATH));

                                                                                        } catch (Exception e) {
                                                                                                Log.e("RecFile Ex In!",
                                                                                                                e.getMessage());
                                                                                        }
                                                                                }
                                                                        });

                                                } catch (XMPPException e) {
                                                        e.printStackTrace();
                                                }

                                        }

OK,大功告成。最後再附上兩個demo的工程文件:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章