登陆到服务器,发送和接收状态信息后,接下来就该进行会话管理了。会话管理,简而言之就是处理入向的连接请求和发送出向的连接请求。会话管理也是libjingle应用最具有用户特性的部分,因为有的会话是进行文件传送,有的会话是进行语音通话,而有的会话是进行视频聊天。如此种种,皆依赖于客户端不同的应用场合。
对于会话管理,下面的步骤都是必须的:
1)实例化NetworkManager, PortAllocator子类和SessionManager对象,这些需要在初始和接收会话请求之前完成。
2)创建一个新的线程对象,作为工作线程使用。创建talk_base::Thread对象,同时将对象作为参数传入SessionManager构造函数。
3)在SessionManager中注册SessionClient子类,SessionManager保存SessionClient的实例号ID,这个ID在发送和接收的代码中都是作为唯一的标识。
4)设置SessionManager发送和接收XMPP消息,SessionManagerTask作为XMPP消息组件和p2p组件的连接器,XMPP消息包括会话请求,应答和候选者列表。
5)复位STUN和接续端口信息。Libjingle默认使用google STUN和接续服务器。当然客户端也可以通过修改HttpPortAllocator中参数值使得客户端访问自己的服务器,从JingleInfoTask对象中可以得到这些信息。
发起和接收连接按照如下流程处理:
1)发送连接请求。发送连接请求意味着创建一个新的会话对象,设置会话信息并发送,在Session::SignalState中等待对应的应答。
2)接收到连接请求。当收到新的会话请求时,一个Session对象会被自动创建,SessionClient::OnSessionCreate也会被调用,有标识表明消息是入向还是出向请求。对于入向请求,需要通知用户,由用户决定接收Session::Accept或者拒绝请求Session:Reject。
3)发送和接收数据。数据通过TransportChannel对象发送和接收。