Page 292 - Web性能权威指南
P. 292

发信服务器可以作为已有通信网络的网关,此时由网络负责将连接提议发送给目标
               端,然后再将应答返回给 WebRTC 客户端,以初始化信息交换。而应用也可以使用
               自己的自定义发信信道,可能由一或多台服务器和一个自定义通信协议构成:如果
               两端都连到了同一个发信服务,那这个服务就可以为它们传递消息。


                           Skype 是使用自定义发信系统中的一个典型示例:音频和视频通信是端到
                          端的,而 Skype 用户必须连接到 Skype 的发信服务器,该服务器使用自己
                          专有的协议辅助实现端到端的连接。



                                             选择发信服务
                WebRTC 可以让我们实现端到端的通信,但每个 WebRTC 应用都需要一个发信服
                务器才能完成协商并建立连接。那该怎么办?
                目前,可以与 WebRTC 互操作的通信网关越来越多。比如 Asterisk 就是这么一个
                流行、免费、开源的框架,被全球很多私人公司和大型运营商采用,以实现他们
                的无线电通信。对我们来说,Asterisk 有一个 WebSocket 模块,该模块支持将 SIP
                作为发信协议:浏览器建立到 Asterisk 网关的 WebSocket 连接,然后两者通过交
                换 SIP 消息来协商会话!

                此外,如果不需要与其他网络互操作,那么实现并部署自定义的发信网络对应用
                而言也不难。比如,一个网站可以为用户提供端到端的音频、视频和数据交换服
                务,而该网站会跟踪所有已经登录的用户,所以它可以对所有在线用户打开发信
                连接。然后,当两个用户想要建立端到端的会话时,网站的服务器就可以为两个
                客户端“鸿雁传书”。

                选择什么发信网关要视具体情况而定,取决于应用的自身需求。不过,在考虑自
                定义之前,有必要先调研一下市面上有哪些开源或商业的服务可用。当然,一定
                要密切关注底层的发信协议,因为协议很可能严重影响发信通道的延迟和客户端
                与服务器的开销;参见 14.4 节“应用 API 与协议”。


               18.4.2 会话描述协议(SDP)

               假设应用实现了共享的发信通道,   那接下来就可以执行发起 WebRTC 连接的初始
               步骤:

                   var signalingChannel = new SignalingChannel(); ➊
                   var pc = new RTCPeerConnection({}); ➋

                   navigator.getUserMedia({ "audio": true }, gotStream, logError);  ➌

                   function gotStream(stream) {


               282   |   第 18 章
   287   288   289   290   291   292   293   294   295   296   297