- WebRTC音视频实时互动技术:原理、实战与源码分析
- 李超编著
- 1171字
- 2021-08-06 14:49:35
4.4.3 信令服务器的实现
接下来看一下信令服务器的实现。要实现信令服务器,我们需要思考以下几个问题:如何通过NodeJS实现一个HTTP服务?如何使用socket.io库?如何进行信令的转发?下面我就来回答上面的问题,当这几个问题解答完了,信令服务器也就实现了。
1)如何通过NodeJS实现一个HTTP服务?在NodeJS上开发一个HTTP应用只要几行代码即可,如代码4.1所示。
代码4.1 HTTP服务器
1 … 2 const http = require('http');//引入http库 3 const express = require('express'); //引入express库 4 5 //创建HTTP服务,并侦听8980端口 6 const app = express(); 7 const http_server = http.createServer(app); 8 http_server.listen(8080, '0.0.0.0'); 9 …
上面的代码中引入了两个库:一个是http库,用于创建HTTP服务;另一个是express库,是一套开发Web应用的框架,它提供了很多开发Web应用的工具。
通过上面引入的两个库,你很容易写出一个HTTP服务来。首先,通过express创建一个Web应用,如第6行代码所示;之后调用HTTP库的createServer()方法创建HTTP对象,即http_server;最后调用http_server对象的listen()方法侦听8080端口。通过上面的步骤就实现了一个HTTP服务。
2)如何使用socket.io库?在使用socket.io库之前,也需要像开发HTTP服务一样,先通过require将它引入程序中,然后利用socket.io的on方法接收消息,用emit方法发送数据。下面是socket.io的几个常见方法:
·给本次连接发送消息,如代码4.2所示。
代码4.2 发送消息
socket.emit('cmd')
·给本次连接发送带参数的消息,如代码4.3所示。
代码4.3 发送带参数消息
socket.emit('cmd',arg1); // 多 个 参 数 往 后 排
·给除本次连接外房间内的所有人发消息,如代码4.4所示。
代码4.4 给房间内的所有人发消息
socket.to(room)emit('cmd')
·接收消息,如代码4.5所示。
代码4.5 接收消息
socket.on('cmd', function(){ … })
·接收带参数的消息,如代码4.6所示。
代码4.6 接收带参数的消息
socket.on('cmd', function(arg1){ … })
3)如何转发信令?你需要根据收到的客户端不同的信令,给它返回不同的结果,如代码4.7所示。
代码4.7 转发信令
1 … 2 io.sockets.on('connection', (socket) => { 3 4 //收到message时,进行转发 5 socket.on('message', (message) => { 6 //给另一端转发消息 7 socket.to(room).emit('message', message); 8 }); 9 10 //收到 join 消息 11 socket.on('join', (room) => { 12 var o = io.sockets.adapter.rooms[room]; 13 14 //得到房间里的人数 15 var nc = o ? Object.keys(o.sockets).length : 0; 16 if (nc < 2){ //如 果 房 间中 没 有 超 过 2 人 17 socket.join(room); 18 //发 送 joined消 息 19 socket.emit('joined', room); 20 ... 21 } else { // max two clients 22 socket.emit('full', room); //发 送 full 消 息 23 } 24 } 25 ... 26 });
从上面的代码片段中可以看到,所有消息的处理都是在客户端与服务器建立连接之后进行的。因此,需要提前将connection消息的处理函数注册到socket.io中(即第2行代码的含义);然后,再分别注册各消息(joined、message……)的处理函数。这样,当服务器收到客户端发来的消息时,socket.io就会根据消息类型调用注册的处理函数,从而完成对应的业务处理。
经过上面的讲解,现在再看代码4.7是不是觉得很简单了?其具体过程如下:如果服务端收到message消息,它不做任何处理,直接进行转发(第7行代码);如果是join消息,则首先将用户加入服务端管理的房间中,之后向客户端返回joined消息(第17、第19行代码);如果用户加入时房间里已经有两个用户了,则拒绝该用户的加入,并返回full消息,以告之目前房间里人已经满了(第22行代码);对于其他消息的处理以此类推。
经过上面的步骤后,信令服务器开发完成。接下来介绍如何将开发好的代码部署到服务器上。