Gloox發送消息

Gloox發消息很簡單,通過前面的接消息的描述,當需要與遠端進行通話時,建立一個MessageSession會話,一旦你擁有這樣的一個會話對象了,就可以調用其中的send方法來向遠端發送消息了。那麼這個MessageSession如何獲得呢?

通過前面接消息的描述,如果是遠端先給你發了消息,此時gloox後臺就會創建一個MessageSession對象出來,而如果你收到這個MessageSession傳來的消息之後,如果不將其刪除,並且通過某種數據結構,如STL中的map,其關鍵字是遠端的JID號,而value值就是這個MessageSession,那麼,如果你需要向遠端發消息時,從該map中通過遠端的JID號,查找對應的MessageSession指針,就可以調用其中的send方法向遠端發消息了。

現在有一個問題是,如果遠端沒有主動向你發消息呢?其實也很簡單,自己創建一個MessageSession對象,也是可以發的,當然,如果你需要保存創建的MessageSession對象的話,也是需要通過自己的數據結構進行保存的。創建一個MessageSession對象很簡單,示例代碼如下:

JID jidd( remoteId);

MessageSession *mess = new MessageSession(client,jidd);

mess->send(“您好”);

client->disposeMessageSession(mess);

對上面的代碼做一個解釋:

第一行主要是創建一個JID,裏面的remoteId用來指明要向遠端發送消息的標識,應該是這樣的一個std::string型的字符串,示例如:remoteId = test@xppserver/test,第一行中構造了一個JID對象,用來表示向哪一個遠端發消息的標識。

第二行中就是創建一個MessageSession對象,構造函數中的第一個參數,是一個Client型的指針,在和XMPP服務建立連接的一文中,已經說明了如果獲得這樣一個連接,現在構造這樣一個MessageSession,其第一個參數就是這樣的連接指針,而第二個參數很簡單了,就是在第一行創建的JID對象。

第三行就是調用MessageSession對象中的send方法,向遠端發送消息,其參數是一個STL中的string型字符串。當你調用這個send方法後,就可以發遠端發消息了,遠端也可以接收你所發送的消息。

第四行並不是必須的,如果你需要保存這個MessageSession對象,以希望下次能夠繼續通過該對象向遠端發送消息,則不用調用該方法,那麼這個方法是用來幹嘛的呢?就是刪除你所創建的MessageSession對象,在gloox內部會delete掉你所new的這個MessageSession對象,不用你去手動地delete,這個是需要注意的地方,之前我也在這裏犯了一個錯誤,因爲是自己動態的new出一個MessageSession對象,當我調用其中的send方法向遠端發送消息後,就手動地在下面調用delete mess,後來發現有問題,因爲如果你發送的數據可能過長,而還沒有發送完成時,你執行了下面的delete mess,則會出問題。後來我想創建一個局部變量,而不用new出一個來,這樣應該沒問題了吧?但是仍然是有問題的,因爲可能你的局部變量生命週期過期了,而你的消息仍沒有被髮送完,這樣自然也是有問題的。所以只能是new一個MessageSession對象出來,如果你需要刪除這個對象的話(當然你總應該在某個地方將你new的對象刪除),則應該調用你的連接對象中的disposeMessageSession方法將其刪除掉。因爲gloox內部會處理在刪除之前,如果還沒發送完消息,會等其發送完之後,再將其刪除的。當然從某種程度來說,你自己new的對象,需要別人來刪除,是一種不好的編程習慣的,但是卻可以使結構清楚,並且不用使用者去關心底層的東西,即不用擔心文本是否發送完了而刪除的問題,也是一個不錯的選擇。

好了,向遠端發送文本消息就是這麼一點內容,比較簡單,後面我會繼續說一下關於文件的傳輸與接收的使用方法,以及會議的使用,相對比較複雜一些,但是隻要明白了其中的道理,然後再結合裏面的示例代碼,我想應該不難。

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