从 0 打造音视频直播系统
李超
前新东方音视频直播技术专家,前沪江音视频架构师
32579 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
WebRTC 1对1通话 (23讲)
从 0 打造音视频直播系统
15
15
1.0x
00:00/00:00
登录|注册

11 | 如何通过Node.js实现一套最简单的信令系统?

增加学习成本
得到更多公司支持
用户更好地对接业务
集中精力开发WebRTC库
libuv处理网络事件
V8引擎
完整的生态链
使用JavaScript语言开发服务器程序
坏处
好处
服务器端代码
客户端代码
消息发送与接收
服务端与客户端关系
安装NPM
安装Node.js
Node.js的基本工作原理
Node.js的优势
信令的交换
房间管理
1 对 1通信
信令交换
服务端无约束
客户端约束
思考时间
小结
启动服务器并测试
实现信令服务器
Socket.io的使用
安装与使用Node.js
为什么选择Node.js?
信令服务器的实现
WebRTC信令服务器的作用
WebRTC 1.0 规范
如何通过Node.js实现一套最简单的信令系统?

该思维导图由 AI 生成,仅供参考

通过前面几篇文章的讲解,我想现在你应该已经对 WebRTC 有了一个清楚的认知了。接下来的章节咱们就使用 WebRTC 逐步实现一套真实可用的 1 对 1 实时直播系统吧。
WebRTC 1.0 规范对 WebRTC 要实现的功能、API 等相关信息做了大量的约束,比如规范中定义了如何采集音视频数据、如何录制以及如何传输等。甚至更细的,还定义了都有哪些 API,以及这些 API 的作用是什么。但这些约束只针对于客户端,并没有对服务端做任何限制。
那 WebRTC 规范中为什么不对服务器也做约束呢?其实,这样做有以下三点好处。
第一点,可以集中精力将 WebRTC 库做好。WebRTC 的愿景是使浏览器能够方便地处理音视频相关的应用,规范中不限制服务端的事儿,可以使它更聚焦。
第二点,让用户更好地对接业务。你也清楚,信令服务器一般都与公司的业务有着密切的关系,每家公司的业务都各有特色,让它们按照自已的业务去实现信令服务器会更符合它们的要求。
第三点,能得到更多公司的支持。WebRTC 扩展了浏览器的基础设施及能力,而不涉及到具体的业务或产品,这样会更容易得到像苹果、微软这种大公司的支持,否则这些大公司之间就会产生抗衡。
当然,这样做也带来了一些坏处,最明显的一个就是增加了学习 WebRTC 的成本,因为你在学习 WebRTC 的时候,必须自己去实现信令服务器,否则你就没办法让 WebRTC 运转起来,这确实增加了不少学习成本。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用Node.js和Socket.io构建一个简单的WebRTC信令服务器。文章首先解释了WebRTC规范对客户端的约束,然后详细介绍了信令服务器的作用和Node.js的优势。接着,文章展示了Node.js和Socket.io的使用方法,并提供了客户端和服务器端的代码示例。通过这些示例,读者可以了解如何通过Node.js和Socket.io实现信令数据通讯。最后,文章提到了如何启动服务器并进行测试,并鼓励读者在此基础上不断增加功能,以构建一个完整的Demo程序。整体而言,本文以简洁的语言和清晰的逻辑,介绍了使用Node.js和Socket.io构建WebRTC信令服务器的基本原理和方法,适合技术人员快速了解和入门。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 打造音视频直播系统》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 花果山の酸梅汤
    client代码运行于浏览器渲染引擎中的V8引擎,server代码运行于Node.js的JS运行时的V8引擎部分。一个面向渲染一个面向提供后台服务。

    作者回复: very good!

    2019-09-10
    7
  • 天天
    老师,您在介绍node. js的Reactor模式时和我以往理解的有点出入。您说道有个线程池的概念,我的理解应该是没有的喔(虽然我们可以使用worker来创建)还请提点一下我呦,推我篇文章也行😁谢谢啦

    作者回复: nodejs 底层用的 libuv, 在 libuv 中使用了线程池,你可以看一下libuv的源码 https://github.com/libuv/libuv/tree/v1.x/src

    2019-12-11
    2
  • jike
    不懂 node 的小白 客户端运行报错 404 http://127.0.0.1:8000/socket.io/?EIO=3&transport=polling&t=MvPeDk4; 服务端运行没有任何输出 浏览器也访问不了

    作者回复: 如果你对 node 不熟悉的话,确实会有这类问题。建议你看一下我在imooc.com中的webrtc入门与实战的视频,在那个视频中有讲具体的步骤!

    2019-11-11
    2
    2
  • Ethan
    客户端一定要引入socket. io吗?可以直接用 websocket api吗

    作者回复: 可以,用websoket你要自己写一个房间服务器

    2019-08-09
    2
  • 人生在事
    李老师,文章实例里客户端都没有指明连哪个端口,服务端怎么监听的啊?

    作者回复: 按说你应该能想到才对,它与浏览器用的同一个连接

    2020-11-04
    3
    1
  • 宇宙之王
    老师好,有个问题不明白,socket = io.connect(); 没指定端口也能连接通吗?第一次接触node,废了半天劲,这章源码和课程不太一致,运行不了,安装各种node模块又把server.js 做了如下修改 暂时去掉了https和log4j,已部署到服务器测试,大家有调不通的先试试这个,有问题互相多沟通 'use strict' var http = require('http'); var https = require('https'); var fs = require('fs'); var socketIo = require('socket.io'); var express = require('express'); var serveIndex = require('serve-index'); var USERCOUNT = 4; var app = express(); app.use(serveIndex('./public')); app.use(express.static('./public')); //http server var http_server = http.createServer(app); var io = socketIo.listen(http_server); io.sockets.on('connection', (socket)=> { socket.on('message', (room, data)=>{ console.log('message, room: ' + room + ", data, type:" + data); socket.to(room).emit('message',room, data+'from server!'); }); socket.on('join', (room)=>{ socket.join(room); var myRoom = io.sockets.adapter.rooms[room]; var users = (myRoom)? Object.keys(myRoom.sockets).length : 0; console.log('the user number of room (' + room + ') is: ' + users); if(users < USERCOUNT){ socket.emit('joined', room, socket.id); //发给除自己之外的房间内的所有人 if(users > 1){ socket.to(room).emit('otherjoin', room, socket.id); } }else{ socket.leave(room); socket.emit('full', room, socket.id); } }); socket.on('leave', (room)=>{ socket.leave(room); var myRoom = io.sockets.adapter.rooms[room]; var users = (myRoom)? Object.keys(myRoom.sockets).length : 0; console.log('the user number of room is: ' + users); socket.to(room).emit('bye', room, socket.id); socket.emit('leaved', room, socket.id); }); }); http_server.listen(8080, '0.0.0.0');

    作者回复: 你觉得呢?实际上它会利用浏览器的连接,你再好好理解一下

    2020-09-14
    1
  • like_wind
    没太理解老师说的这个房间的概念,文中提到的“房间概念”是指客户端和服务端的一个连接就是一个房间吗?还是说这个房间指的是业务上的某一个房间,比如说某直播平台的一个直播间?

    作者回复: 是的,就是指后者“一个直播间”

    2020-03-23
    1
  • dahaowenge
    node serves.js Error: ENOENT: no such file or directory, open './cert/1557605_www.learningrtc.cn.key'

    作者回复: 你要使用自己的证书,这是我的证书你是不能用的。另外要使用真正的证书,你可以通过购买域的,然后申请免费证书的方式获取。购买一个域名最便宜的 6元。但如果在国内购买域名的话,还要进行备案,这个在北京需要 20天的时间

    2019-10-10
    3
    1
  • Jason
    老师好,问一下, 这套简单的信令系统,已经实现了交换各端sdp信息的功能了吗?

    作者回复: 实现了,不过对他的讲解在第23篇文章中才会做详细介绍

    2019-08-27
    1
  • 许童童
    两个不同的 V8 引擎上,你知道它们的对应关系吗 一个是nodejs服务端的V8,一个是浏览器中客户端的V8。

    作者回复: 没错!

    2019-08-08
    1
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部