登陆到服务器,发送和接收状态信息后,接下来就该进行会话管理了。会话管理,简而言之就是处理入向的连接请求和发送出向的连接请求。会话管理也是
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
对象发送和接收。