关闭信令通道
现在,我们准备分析通道销毁,如 图4-19 的呼叫流摘要所述。
图4-19 关闭信令通道
销毁过程实际上是通过在两个浏览器之一中插入 Bye
消息触发的(请参见 图4-20 )。
幕后发生的事情如下:
// User wants to quit conversation: send 'Bye' to remote party
if(chatMessage == "Bye") {
div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Sending "Bye" to server...</p>');
console.log('Sending "Bye" to server');
socket.emit('Bye', channel);
div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Going to disconnect...</p>');
console.log('Going to disconnect...');
// Disconnect from server
socket.disconnect();
}
图4-20。 通过 Bye
消息关闭通道
从代码中可以看到,断开连接的客户端首先在通道上发送 Bye
消息,然后立即关闭 Web socket(图4-21)。
服务端收到 Bye
消息后,它将首先将其发送给对等方,然后关闭通向断开连接客户端的通信通道:
// Handle 'Bye' messages
socket.on('Bye', function(channel) {
// Notify other peer
socket.broadcast.to(channel).emit('Bye');
// Close socket from server's side
socket.disconnect();
});
图4-21 发起方断开连接
最后,让我们分析对等方从远程方收到 Bye
消息的行为。 对等方首先记录有关接收到的消息的信息(在 JavaScript 控制台上和 HTML5 页面内):
// Handle 'Bye' message
socket.on('Bye', function () {
console.log('Got "Bye" from other peer! Going to disconnect...');
div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Got "Bye" from other peer!</p>');
...
然后,将 Ack
消息发送回服务器以确认收到断开连接请求:
div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Sending "Ack" to server</p>');
// Send 'Ack' back to remote party (through server)
console.log('Sending "Ack" to server');
socket.emit('Ack');
// Disconnect from server
div.insertAdjacentHTML( 'beforeEnd', '<p>Time: ' + (performance.now() / 1000).toFixed(3) + ' --> Going to disconnect...</p>');
console.log('Going to disconnect...');
socket.disconnect();
最后,接收方断开与服务器的连接:
...
console.log('Going to disconnect...');
socket.disconnect();
});
在 图4-22 的快照中可以轻松识别上述操作顺序。
图4-22 远程对等方处理中继断开消息并断开连接
最后的操作在服务器端进行。 在控制台上记录了 Ack
消息的接收情况(请参见 图4-23 ),并且该通道最终被销毁:
// Handle 'Ack' messages
socket.on('Ack', function () {
console.log('Got an Ack!');
// Close socket from server's side
socket.disconnect();
});
图4-23 服务器端的关闭通道
当前内容版权归 Salvatore Loreto & Simon Pietro Romano 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 Salvatore Loreto & Simon Pietro Romano .