连接管理员
引言
连接管理器是群体聊天功能的第一部分.这个类管理对等的连接,并向用户提供多重插座,用于他们想连接的设备.例如,如果爱丽丝想连接到Bob的设备之一,将传输2个文件,她将要求连接管理器向Bob打开2个频道 (每个文件一个).这将给出:
aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file1",
[](std::shared_ptr<ChannelSocket> socket) {
if (socket) {
// transfer first file
}
});
aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file2",
[](std::shared_ptr<ChannelSocket> socket) {
if (socket) {
// transfer second file
}
});
在此之后,连接管理器首先通过DHT连接到Bob的设备 (通过ICE) 并设置TLS Socket.然后,它会要求一个频道,当频道准备好时,通过回调通知Alice.对于第二个文件,它将使用第一个插座,然后将打开一个新的频道 (只需要2个TLS包,所以很快)
子
它们与 call相同,请见 Exchange ICE候选人, ICE谈判, 加密控制插座,但只有TCP.
然而,当一个方收到新的ICE请求时,由 无效onICERequest(onICERequestCallback&&& cb);
设置的回调会触发.
谈判一个新的道
频道由 id (唯一) 和 uri (非唯一) 定义.例如 (1, ‘git://*’)
连接管理器在准备时认为频道0已经存在.这个频道被称为CONTROL频道,用于请求新的频道.
使用的协议非常简单,看起来像RTP协议:
为了存储身体长度,使用16位.
频道ID (目的地) 的16位
身体
所有的包都具有32位的 len头.
为了请求新频道,连接管理员将在频道0中发送一个 ChannelRequest
对象 (msgpack用于串行结构) 来向同行发送新频道的 id 和名称 (有 isAnswer = false
).同行将在ChannelRequest上通过 ̀ void () 调回道.
关闭一个道
如果内容长度为0则,则将为频道发送EOF
连接结构管理器
拥有权
一个JamiAccount拥有连接管理器,并可以访问ChannelSocket对象 (共享_ptr与多复式Socket拥有.
连接管理器拥有多个Sockets和ICE对象
复式Sockets拥有TLS运输和ChannelSocket对象
道Socket拥有数据缓冲器
角色
连接管理器用于管理与同行的连接.
通过TLSSocket发送数据,阅读接入的包,管理道使用MultiplexedSockets.
客户端使用ChannelSockets与其它同行进行互动.
使用
相关单元测试中描述了场景 (test/unitTest/connectionManager/connectionManager.cpp
)