【征文】webRTC的搭档——信令服务器

前言

通过webRTC技术的简单了解学习之后,我们可以发现webRTC仅仅提供了浏览器到浏览器(点对点)之间的通信,想要实现实时互动的场景,仍然需要一个服务器管理客户端的操作,建立浏览器之间的点对点连接。除此之外,一些扩展业务还是需要自建服务器去处理的,比如音视频数据的校验等。当然其主要原因还是因为浏览器之间必须通过服务器才能实时交换音视频流数据或者二进制数据,所以我们需要自行实现一个这样的服务器才能用于实时交换音频、视频和数据,而这个服务器被称为信令服务器。

信令服务器是什么

信令服务器是一个用于客户端交换协商信息的服务器,它作为一个中间人帮助双方在尽可能少的暴露隐私的情况下建立连接。而客户端双方之间需要相互定位并交换协商信息才能实现实时通信,这个过程便被称为信令。在实时通信中,信令的作用主要体现在四个方面:

协商媒体功能和设置
标识和验证会话参与者的身份
控制媒体会话、指示进度、更改会话和终止会话
当会话双方同时尝试建立或更改会话时,实施双占用分解

信令服务的实现

为什么我们要自行实现一个信令服务器呢?根据官网的说法,webRTC技术并没有提供信令传递机制,开发者自行使用任何喜欢的方式如WebSocket或者XMLHttpRequest 等等,来交换彼此的令牌信息。信令服务器并不需要理解和解释信令数据内容,通过信令服务器的消息的内容实际上是一个黑盒,客户端之间只需要将信令数据相互发送并且接受信息,而信令服务器只充当一个转发信息的角色,其中的内容不需要被关注。因此webRTC没有将信令服务纳入到整个的规范中。

WebRTC信令的传输方式通常有三种:HTTP、Websocket和数据通道。
本文则是使用websocket来实现。其主要的功能是接受用户的房间加入,以及用户离开时需要同步给其他用户。服务端用的是NodeJs语言,socket框架用的是socket.io

首先,使用socket.io实现一个简单的房间管理服务,然后浏览器与其服务器建立WebSocket连接。

var io = require('socket.io')(80);
io.on('connection', function (socket) {
	// 连接成功后,监听用户行为的事件,比如用户加入房间、用户离开房间
	socket.on("joinRoom", handleUserJoinRoom);
	socket.on("leaveRoom", handleUserLeaveRoom);
	// 断线处理等...
}) 

当服务器收到客户端A发送加入房间命令时,服务端除了需要把客户端A加入房间,还得把房间里的所有用户同步给该客户端A,并且还需要广播到这个房间,客户端A加入房间了。如此,客户端之间就可以根据信息来逐个构建与其他用户的点对点连接。

const handleUserJoinRoom = (data) => {
    socket.join(data.room);
    var userList = io.sockets.adapter.rooms.get(data.room);
    socket.emit("joined", [...userList].join(","));
    socket.to(data.room).emit('newUserJoined', socket.id);
}

若有用户离开,服务器便处理其用户的离开命令,然后在房间内的其他客户端根据信息关闭与离开用户的信息,并作相应的清除操作

const handleUserLeaveRoom = (data) => {
    socket.leave(data.room);
    socket.to(data.room).emit('userLeaveRoom', socket.id);
}

用户离开页面,关闭WebSocket连接。
当然实际上去实现一个稳定可用的服务器是没那么简单的,本文仅作为demo来使用。

总结

我们可以看到想要实现一个实时互动t的场景,仅仅只靠webRTC技术是无法实现的,我们还需要提供一个信令服务器,用于客户端交换协商信息,然后在浏览器上构建与其他用户的点对点连接。同时简单实现一个信令服务器demo会对信令服务器的基本概念以及其作用的了解有一点的帮助。

推荐阅读
作者信息
相关专栏
音视频杂谈
158 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。