通过前面的描述,当和服务器建立了连接之后,就可以和服务器进行通讯了,今天先说一下接收远端发送来的文本消息的方式吧。
在接收消息之前,需要明确一件事情,就是一旦你登陆至服务器之后,随时有可能有人人给你发来消息,所以应该考虑的是你需要做一个死循环,不断的监听消息,如果有消息之后,根据消息的不同形式,处理它。当然不用担心,觉得用个死循环很影响效率,实际上做过socket的就明白了,当你调用接收消息的函数时,是会阻塞的,如果没有消息,就阻塞,这样就不会浪费资源了。另外由于阻塞的缘故,所以我们不应该在你的主进程中来做接收消息这样的事情,而是通过一个线程,来专门做消息的接收。当你连接至服务器成功之后,就可以启动一个新的线程,在这个线程中利用前面创建好的客户端实例进行消息的接收了。当然,你可以不用阻塞的方式进行接收消息,而是用非阻塞的方式,但是,我觉得做为客户端而言,用阻塞方式更好一些,对于使用非阻塞,在做服务器端时很有用,但是对于客户端而言就显得没有必要了,在我的使用中,客户端都是使用的是阻塞的方式进行接收远端文本数据的。
前面已经说明,当你连接至服务器之后,你会获得一个客户端实例对象(Client),如果一直要保持连接的话,该实例对象应该一直存在。Client这个对象提供了一个recv()的该方法,通过该方法,就可以接收来自远端的消息了(recv文法默认是阻塞的方式的,如果不需要阻塞,可以通过其参数设置就可以了)。
Gloox在接收远端发来的消息时,会调用一个接口的实现类,该接口为:MessageSessionHandler,这个接口里面提供了一个handleMessageSession( MessageSession *session ) = 0方法,当远端有文本消息发来时,Socket接收数据中会创建一个MessageSession实例对象,表明有一个会话产生(一个无端与本地的会话就有一个对应的MessageSession对象),这时如果你注册了实现MessageSessionHandler接口的实现类,则客户端Client会自动调用你的实现类中的handleMessageSession(处理消息会话)接口。HandMessageSession的函数表现形式为:
virtual void handleMessageSession( MessageSession *session )
传入的参数MessageSession