文章出處

在即時通信這個領域目前只找到一個XMPP協議,在其協議基礎上還是有許多成熟的產品,而且是開源的。所以還是想在這個領域多多了解一下。

 

XMPP協議:具體的概念我就不寫了,畢竟這東西網上到處是。簡單的說就是基于XML的一種協議。其解決了什么問題呢?就是給即時通訊制定了標準,大家只要遵守標準就可以完成即時通信的功能。有了標準的好處就是可以有各種不同的實現,大家在這個標準上發展自己的特長。而且還給即時通信提供了互聯互通的基礎。XMPP協議據網上說還是比較優秀的,表現就是google等大公司都在自己的即時通訊產品上。

 

openfire:是我在這個萬花叢中找到的一點紅。選它的主要原因是:

1、它支持XMPP咯

2、它是java實現的,開源的

3、它比較有名,性能不錯

4、部署挺簡單的,還有許多現成的插件

 

至于openfire的安裝部署網上文章比較多,這里也不打算寫。可以到這個網站上找到比較多的資源:http://www.igniterealtime.org/

為什么說openfire部署簡單,我當時只是下載了一個exe的安裝包,然后在windows下按照向導安裝部署配置后,再整個客戶端就可以聊天了。而且在igniterealtime上有配套的客戶端產品,還有類庫提供。對于開發者來說很方便,而且很實用。

 

然而我花了較多時間研究的并不是服務端,畢竟這部分還沒到實際的產品開發,只要能跑即可。所以時間都花在哪了呢?就是客戶端,畢竟spark這個客戶端的界面有點老久,而且聊天功能完成的也比較原始。所以就得花比較多的時間在這上面。

 

另外,實際的需求對客戶的要求是可以適用多平臺:windows,macos,android,ios,甚至還要能在瀏覽器中。畢竟之前沒有做過即時通訊的產品,這一下子還真有點拿不到點。于是只好一個個去接觸了解。經過了解真正能拿來商用的東西不多,只能自己去定制開發。這里有個XMPP的官方網站可以看看:http://xmpp.org/software,這里列舉了一些現有的產品和開發包。包括Clients,Servers,Libraries,Projects。openfire就在Servers中可以找到,spark在Clients可以找到,Smack在Libraries中找到。其中的Projects列舉了一些使用XMPP協議的比較大的項目,比如Google、whatapp、apple,夠大了吧。

 

我的想法是圍繞igniterealtime來展開吧,畢竟是個持續維護的產品系列。

1、spark可以使用在多平臺上,這樣PC端的算是解決了

2、smack包可以支持android平臺,可以在這個包基礎上定制開發android的產品

 

spark的功能還是比較完整的,文本、圖片、文件消息都支持,單聊、群聊也支持。只要在界面上做些定制便可以用于使用了。而且spark的通訊核心還是smack,這也充分說明了smack的重要性。smack新版本已經支持android,為此我就直接寫了一個smack的android版本的demo,這樣一方面了解一下smack,同時也了解一下android的開發。

源代碼已經放在github上:https://github.com/mini188/SmackDemo

 

完成的非常搓,也就是個登錄、簡單聊天。

 

簡單的寫了一個單例的類:XmppConnectionService,主要是負責與Xmpp服務器的通訊管理,這里面最主要的就是建一個連接,由于smack(4.1.x)的版本更新后和之前老的api不一樣了。所以在我在網上看到很多資料都是比較老的寫法,試了一段時間都是失敗。后來找到方法:

    public void Connect (String userName, String pwd){
        if (_xmppConnection != null && _xmppConnection.isConnected()) {
            return;
        }

        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setHost("192.168.45.41");
        configBuilder.setPort(5222);
        configBuilder.setUsernameAndPassword(userName, pwd);
        configBuilder.setServiceName("zrtc");
        configBuilder.setCustomSSLContext(getSslContent());
        //configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);

        _xmppConnection = new XMPPTCPConnection(configBuilder.build());
        new Thread() {
            @Override
            public void run() {
                try {
                    _xmppConnection.connect();
                    _xmppConnection.login();
                } catch (IOException e) {
                    Log.e("XMPP_CONNLOGIN", e.getMessage());
                } catch (XMPPException e) {
                    Log.e("XMPP_CONNLOGIN", e.getMessage());
                } catch (SmackException e) {
                    Log.e("XMPP_CONNLOGIN", e.getMessage());
                }
            }
        }.start();
    }

這段代碼里主要是兩點注意:

1、服務器通訊要用自定義證書的話要用自定義的SSLConent,說白點就是不驗證證書是否可信。這玩意不知道使用有CA簽名的證書會不會有這問題。

2、connect要使用線程來執行,這是由于android中不允許在主線程中跑這種耗時的代碼,影響界面響應

 

獲取登錄用戶的好友列表:

 Roster roster = Roster.getInstanceFor(_conn);
 Set<RosterEntry> entries = roster.getEntries();

創建聊天會話:

    private void createChat(Intent intent) {
        _jid = intent.getStringExtra(JID);
        _chat = _chatMgr.createChat(_jid);


        _chat.addMessageListener(new ChatMessageListener() {
            @Override
            public void processMessage(Chat chat, Message message) {
                addMessage(message);
            }
        });
    }

會話還可以監聽消息,這樣對方發來消息就可以進行處理。比如顯示在聊天記錄里。

 

發送聊天信息:

        _sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText sendText = (EditText) findViewById(R.id.textinput);
                String msg = sendText.getText().toString();
                if (!msg.equals("")) {
                    Message message = new Message();
                    message.setTo(_jid);
                    message.setBody(msg);
                    message.setType(Message.Type.chat);
                    addMessage(message);
                    try {
                        _chat.sendMessage(message);
                    } catch (SmackException.NotConnectedException e) {
                        e.printStackTrace();
                    }
                    sendText.setText("");
                }
            }
        });

還是通過會話_chat,它有一個方法sendMessage就可以將消息發送出去,挺簡單的吧。

 

最后貼一下聊天的效果吧,真的好搓:

 

最后備注一下,這個android的客戶端demo代碼參考了一個開源項目:https://github.com/siacs/Conversations

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()