浏览器从node.js服务器获取到www/index.html页面和meetingRoom.html页面及引用的js脚本
加入会议,执行connect方法,在connect方法中使用webSocket与SFU服务(index.js中 webSocketServer )建立连接;(携带userName、roomId参数);

服务端收到客户端webSocket连接请求后,从URL中解析到roomId,然后根据该参数判单房间是否在之前创建过,如果该房间已创建,则什么都不做;如果没创建,则尝试创建Room实例;
对于客户端来说,websocket连接成功后,发送join信令到服务端,服务端收到join信令后,创建participant(参与者)实例,并且调用它的init方法进行初始化;
之后,Participant获取room中所有已共享的媒体流,并调用它的addStream方法,这样它就可以订阅room中的所有媒体流了;
订阅成功后,媒体流的数据就被源源不断的发送给participant的终端endpoint了;
上面逻辑完成后,服务端会通知客户端join成功,此时客户端也可以共享它的音视频给服务器了;
当客户端的数据到达服务器后,服务器将数据 暂存到Participant的incomingStreams中,以备后面发给其他终端;
通过上面的步骤,新加入的客户端就可以看到会议中其他人分享的音视频流了,同时还可以将自己的音视频推送到服务器,但此时其他参会者还看不到新加入用户的音视频流,还有关键的一步:
当新参会人一切准备就绪后,服务端要广播消息(update)通知所有已经在会中的其他人,有新用户进来了,需要重新进行媒体流协商(renegotiationneeded),重新媒体协商后,其他参会人才能看到新入会人的视频流。