Joiner 的 answer

既然我们已经完成了 ICE 候选人交换,那么让我们重新思考一下。 我们当时(第115页上的“ Joiner 管理 Initiator 的 Offer ”)是 Joiner 通过创建自己的 PeerConnection 对象来处理 Initiator 的 Offer 的时候。 如 图5-15 所示,完成此操作后,Joiner 首先将接收到的 SDP 与新实例化的 PeerConnection 相关联,然后立即调用 doAnswer() JavaScript 函数。

图5-15

图5-15 Joiner’s Answer to Initiator’s Offer

下面的代码片段突出显示了 Joiner 算法的这一特定部分:

  1. // Receive message from the other peer via the signaling server
  2. socket.on('message', function (message) {
  3. console.log('Received message:', message);
  4. if (message === 'got user media') {
  5. ...
  6. } else if (message.type === 'offer') {
  7. ...
  8. pc.setRemoteDescription(new RTCSessionDescription(message));
  9. doAnswer();
  10. } else if (message.type === 'answer' && isStarted) {
  11. ...

doAnswer() 函数基本上处理与接收到的 Offer 关联的 SDP Answer 的创建:

  1. function doAnswer() {
  2. console.log('Sending answer to peer.');
  3. pc.createAnswer(setLocalAndSendMessage,onSignalingError, sdpConstraints);
  4. }

createOffer() 方法类似,一旦浏览器使本地 SDP 可用, createAnswer() 调用将设置成功处理程序,该处理程序将被调用。 这种处理程序的作用是首先将浏览器提供的 SDP 设置为与 Joiner 的 PeerConnection 相关联的本地会话描述,然后通过信令服务器将此类描述发送给远程方:

  1. function setLocalAndSendMessage(sessionDescription) {
  2. pc.setLocalDescription(sessionDescription);
  3. sendMessage(sessionDescription);
  4. }

当启动器从服务器接收到 Joiner’s Answer 时,可以将其正确设置为与其本地 PeerConnection 对象关联的远程会话描述:

  1. // Receive message from the other peer via the signaling server
  2. socket.on('message', function (message) {
  3. console.log('Received message:', message);
  4. if (message === 'got user media') {
  5. ...
  6. } else if (message.type === 'offer') {
  7. ...
  8. } else if (message.type === 'answer' && isStarted) {
  9. pc.setRemoteDescription(new RTCSessionDescription(message));
  10. } else if (message.type === 'candidate' && isStarted) {
  11. ...
  12. } else if (message === 'bye' && isStarted) {
  13. ...
  14. }
  15. });