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行代码);对于其他消息的处理以此类推。

经过上面的步骤后,信令服务器开发完成。接下来介绍如何将开发好的代码部署到服务器上。