(原文出自:http://blog.csdn.net/qiuhong101)
由于工作忙的原因,竟很久没写下去了,后面得坚持下去。今天主要说一下关于通过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的对象,需要别人来删除,是一种不好的编程习惯的,但是却可以使结构清楚,并且不用使用者去关心底层的东西,即不用担心文本是否发送完了而删除的问题,也是一个不错的选择。
好了,向远端发送文本消息就是这么一点内容,比较简单,后面我会继续说一下关于文件的传输与接收的使用方法,以及会议的使用,相对比较复杂一些,但是只要明白了其中的道理,然后再结合里面的示例代码,我想应该不难。