使用Swoole协程实现 WebRTC 信令服务器( 三 )


case 'offer':icecandidate(localStream);pc.setRemoteDescription(new RTCSessionDescription(data), function () {if (!answer) {pc.createAnswer(function (desc) {pc.setLocalDescription(desc, function () {publish('answer', pc.localDescription);}, function (e) {alert(e);});}, function (e) {alert(e);});answer = 1;}}, function (e) {alert(e);});break;5. 对端收到answer信息,设置远端的描述信息 。当双方都完成offer,answer步骤后,此时双方的媒体协商已经完成 。我们已经绑定过网络信息到服务端,各端会等待接收候选者列表 。
case 'answer':pc.setRemoteDescription(new RTCSessionDescription(data), function () {}, function (e) {alert(e);});break;6. 收到候选者列表后,需要把各自的候选信息通过信令服务器中转到对方 。
pc.onicecandidate = function (event) {if (event.candidate) {publish('candidate', event.candidate);}};7. 各端收到对方的候选者列表后,会把对端的候选者加入当前连接通路的候选者列表中,然后双方会进行连接检测等等一系列复杂的操作,当找到一个最优的链路之后,就会建立连接,进行数据交互 。
pc.addIceCandidate(new RTCIceCandidate(data), function () {}, function (e) {alert(e);});break;信令服务端
我们介绍了建立连接的过程,针对服务端代码,可以看到信令服务器端的代码很少,加上http的服务总计100行代码左右,怎样达到通过同步编程的方式实现异步非阻塞IO,并且可以很轻松的实现并发百万呢?

  • 首先通过构造函数$server = new SwooleCoroutineHttpServer('0.0.0.0', 9509, true);会创建server对象 。
  • 当调用$server->start();方法后,会循环进行accept,accept连接后,会创建一个协程,这个协程内所有的消息收发,都会引起协程调度 。
  • 可以低成本创建成千上万协程,并发百万没问题,底层会为每个协程开辟独立的栈空间,并基于多路复用技术(linux下为EPOLL)来进行调度 。
信令服务器利用Swoole协程技术,单进程支持异步非阻塞IO高并发,但编程完全是同步阻塞的模式 。如果想进一步要利用多核,可以采用Process Pool,加reuse port(Linux kernel 3.9)技术,开启多个进程同时处理,代码仓库中有一份server_co_pool.php的相关实现
$resp->subjects = array();while (true) {$frame = $resp->recv();if (empty($frame)) {break;}$data = https://www.isolves.com/it/cxkf/yy/php/2020-08-12/json_decode($frame->data, true);switch ($data['cmd']) {case 'subscribe':subscribe($data, $resp);//订阅break;case 'publish':publish($data, $resp);//广播除自己以外的连接break;}}free_connection($resp);服务端处理核心逻辑为将当前连接加入内存map中,以供新的连接到来查找广播,连接关闭时,清理对应的主题和fd 。
到此,我们使用Swoole协程实现WebRTC信令服务器结束 。项目源码已上传至https://github.com/shiguangqi/SwooleWebRTC
备注:当前例子运行环境为
  • PHP 7.2.14 (cli)
  • Swoole v4.4.16
  • Darwin mbp 19.3.0 Darwin Kernel Version 19.3.0 和 18.04.1-Ubuntu
谢谢,欢迎各位老师批评指正 。

【使用Swoole协程实现 WebRTC 信令服务器】


推荐阅读