关闭信令通道

现在,我们准备分析通道销毁,如 图4-19 的呼叫流摘要所述。

图4-19

图4-19 关闭信令通道

销毁过程实际上是通过在两个浏览器之一中插入 Bye 消息触发的(请参见 图4-20 )。

幕后发生的事情如下:

  1. // User wants to quit conversation: send 'Bye' to remote party
  2. if(chatMessage == "Bye") {
  3. div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Sending "Bye" to server...</p>');
  4. console.log('Sending "Bye" to server');
  5. socket.emit('Bye', channel);
  6. div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Going to disconnect...</p>');
  7. console.log('Going to disconnect...');
  8. // Disconnect from server
  9. socket.disconnect();
  10. }

图4-20

图4-20。 通过 Bye 消息关闭通道

从代码中可以看到,断开连接的客户端首先在通道上发送 Bye 消息,然后立即关闭 Web socket(图4-21)。

服务端收到 Bye 消息后,它将首先将其发送给对等方,然后关闭通向断开连接客户端的通信通道:

  1. // Handle 'Bye' messages
  2. socket.on('Bye', function(channel) {
  3. // Notify other peer
  4. socket.broadcast.to(channel).emit('Bye');
  5. // Close socket from server's side
  6. socket.disconnect();
  7. });

图4-21

图4-21 发起方断开连接

最后,让我们分析对等方从远程方收到 Bye 消息的行为。 对等方首先记录有关接收到的消息的信息(在 JavaScript 控制台上和 HTML5 页面内):

  1. // Handle 'Bye' message
  2. socket.on('Bye', function () {
  3. console.log('Got "Bye" from other peer! Going to disconnect...');
  4. div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Got "Bye" from other peer!</p>');
  5. ...

然后,将 Ack 消息发送回服务器以确认收到断开连接请求:

  1. div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Sending "Ack" to server</p>');
  2. // Send 'Ack' back to remote party (through server)
  3. console.log('Sending "Ack" to server');
  4. socket.emit('Ack');
  5. // Disconnect from server
  6. div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Going to disconnect...</p>');
  7. console.log('Going to disconnect...');
  8. socket.disconnect();

最后,接收方断开与服务器的连接:

  1. ...
  2. console.log('Going to disconnect...');
  3. socket.disconnect();
  4. });

在 图4-22 的快照中可以轻松识别上述操作顺序。

图4-22

图4-22 远程对等方处理中继断开消息并断开连接

最后的操作在服务器端进行。 在控制台上记录了 Ack 消息的接收情况(请参见 图4-23 ),并且该通道最终被销毁:

  1. // Handle 'Ack' messages
  2. socket.on('Ack', function () {
  3. console.log('Got an Ack!');
  4. // Close socket from server's side
  5. socket.disconnect();
  6. });

图4-23

图4-23 服务器端的关闭通道