域(scope)的概念指的是 房间,准确的说应该是类似于房间。因为视频聊天室存在这样的情况:一对一,一对多和群组聊天。如果统一用房间表示也可以,不过会有很多冗余,所以这里按域设计,将各种情况,进行不同的处理。
域的分类设计
下面分析下各种情况:
- 一对一聊天:需要实现客户端A和客户端B互相连接,那么该域需要两个webrtc 对象,互相连接。
- 一对多聊天:需要实现客户端A和客户端B、C连接,但B、C不需要和A连接,并且B和C也不需要连接,那么该域需要 N + 1 个 webRtc 对象,1 为一,N 为多,1 需要连接 N, 但N 不需要和1 连接。
- 群组聊天(多对多):需要实现客户端A、客户端B和客户端C两两之间互连。那么该域需要N的2次方个WebRtc 对象。例如客户端A 需要三个webRtc 对象,一个用作输出(即输出自身流媒体信息),另外两个用作接收(即接收B 和 C 的流媒体信息)。
注 :这里的连接指的是 服务器端的 KMS 内部连接,如果A连接B ,但B不连接A,那么B 能够收到A的媒体信息,但A不能够收到B的媒体信息,并且连接意味着需要建立对应的 webRtc 对象。
域的生命周期
域的生命周期和用户以及域的类型是严格相关的;
- 一对一聊天时,双方断开一方,则销毁该域;
- 一对多聊天时,一的一方断开,则销毁该域;
- 群组聊天时,删除该群组时,则销毁该域;
域的类设计
Scope
顶级的域接口,只含有一个 dispose
(销毁)方法。
BaseScope
:域的基础类,其它类均从此类继承而来。该类含有域所需要的基本信息:域id 、域的名称、域发起者名称以及媒体管道。除了域的名称不是必须的外,其余的均需要赋值。
以下域均继承自BaseScope
:
-
OneToOneScope : 一对一聊天时,需要用到的域;
-
OneToManyScope: 一对多聊天时,需要用到的域;
-
GroupScope:群组聊天时,需要用到的域;
域的工厂类设计
OneToOneScopeFactory : 提供了创建一对一域,通知成员以及销毁域的方法;
OneToManyScopeFactory: 提供了创建一对多域,通知成员,移除成员以及销毁域的方法;
GroupManyScopeFactory: 提供了创建群组域,通知成员,从指定成员接收媒体流,以及关闭会议室和退出会议室方法。
通过工厂类去操作域,便于统一维护,而且利用spring 的依赖注入,更方便我们进行各种操作。
上下文设计
上下文是指在程序运行期间,需要统一维护的数据。其中包括用户上下文,域上下文,存放有webRtc对象的上下文。