多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 前言 ws这个文件夹下,主要是起了一个ws的服务。处理上课过程中各个客户端产生的信令。 [白板server信令处理流程](https://www.processon.com/view/link/5d22f70ee4b0f42d067b3d86) ## 建立连接 - 实例化WebSocket,监听connnection事件 - 在connection监听器中,创建一个`user`,监听每一个连接的message事件。可以认为每个连接都是一个用户。 - 根据每一个connection携带的参数,为`user`分组 ## 用户分组逻辑 客户端向服务端建立连接是携带的参数: - `identity` 用户身份 - `userId` 用户ID - `lessonId` 课件ID,用于请求PPT信息 - `periodId` 教室ID - `partId` 用于api请求,ws服务本身不关心 - `hash` 客户端生成的随机标识 根据用户的periodId创建lesson,可以看做一个教室,多个lesson以peridId为key保存在channelMap中,lesson的主要内容为: - users:保存当前连接的用户 - lessonId:当前课堂内使用的PPT的Id - pptRescorder:PPT的管理器 - hashMap:用于保存课堂内产生的所有消息的hash值 ### PPTRecorder 如果`partId`、`lessonId`、`periodId`都相同的连接,共享一个PPTRecorder。 初始化时,根据`partId`、`lessonId`、`periodId`生成一个`infoKey`,同时取当前时间`startTime`作为实例初始化时间,将`{key: infoKey, value: startTime}`存入redis,如果key已存在就更新`startTime`。 `PPTRecorder `主要负责记录上课过程中产生的信令,并且当用户中途加入课堂是一次性返回已经产生的信令。 关于**保存信令**,在上课过程中,`recorder`通过`startTime`生成`recordKey`,将接收到的信令储存到redis;上课中途收到`keyframe`类型的消息,将当前记录的信令全部发送到客户端;上课结束,将redis中记录的信令持久化到数据库。 ## 处理信令消息 - ws心跳 - WsMessage - Cmd & Signal ### Cmd & Signal 这类信息是普通的JSON字符串,其中Cmd用户控制课程开始结束,Signal则是客户端发送。 **课程开始**: 创建PPTRecorder实例,记录开始时间,记录信令。 **课程结束**: 记录结束时间,将redis中的信令持久化。 ### WsMessage - `keyframe`: 将当前的信令历史发送给消息来源客户端(单播) - `broadcast`/`media`/`animation`/`extra`/`template`: 将信令储存到redis中,同时组播类课堂内的其他用户(不包括自己) - `startTime`: 将服务器时间发送给消息来源客户端(单播) - `syncMedia`: 组播