4.4.5 信令服务器的完整代码

通过上面的讲解,相信大多数读者完全能自己实现一个WebRTC一对一信令服务系统。不过对于新手来说,即使讲解得再详细,也不如有一个完整的例子做参考来得实际。为此我特意将信令服务器的完整代码放在本章的最后作为参考,具体参见代码4.8。

代码4.8 信令服务器完整代码


1 'use strict '
2
3 // 依赖库
4 var log4js = require('log4js '); // 用于输出日志
5 var http = require('http'); // 提供HTTP 服务
6 var https = require('https '); // 提供HTTPS 服务
7 var fs = require('fs'); // 用于读取文件内容
8
9 var socketIo = require('socket.io');
10 var express = require('express ');
11
12 var serveIndex = require('serve -index ');
13
14 // 一个房间里可以同时在线的最大用户数
15 var USERCOUNT = 3;
16
17 // 日志的配置项
18 log4js.configure ({
19   appenders: {
20    file: {
21     type: 'file',
22     filename: 'app.log',
23     layout: {
24       type: 'pattern ',
25       pattern: '%r %p - %m',
26     }
27   }
28 },
29 categories: {
30   default: {
31     appenders: ['file'],
32     level: 'debug '
33    }
34   }
35  });
36
37 var logger = log4js.getLogger ();
38
39 var app = express ();
40 app.use(serveIndex('./ public '));
41 app.use(express.static('./ public '));
42
43 // 设置跨域访问
44 app.all("*",function(req ,res ,next){
45   // 设置允许跨域的域名, * 代表允许任意域名跨域
46   res.header("Access -Control -Allow -Origin","*");
47
48   // 允许的header 类型
49   res.header("Access -Control -Allow -Headers","content -type");
50
51   // 跨域允许的请求方式
52   res.header("Access -Control -Allow -Methods","DELETE ,PUT ,POST ,GET ,OPTIONS");
53   if (req.method.toLowerCase () == 'options '){
54   res.send (200); // 让options 尝试请求快速结束
55   }else {
56   next();
57   }
58 });
59
60 //HTTP 服务
61 var http_server = http.createServer(app);
62 http_server.listen (80, '0.0.0.0 ');
63
64 // 你的网站证书
65 var options = {
66 key : fs.readFileSync('./cert/cert.key'),
67 cert: fs.readFileSync('./cert/cert.pem')
68 }
69
70 // HTTPS 服务
71 var https_server = https.createServer(options , app);
72 var io = socketIo.listen(https_server);
73
74 // 处理连接事件
75 io.sockets.on('connection ', (socket)=> {
76
77 // 中转消息
78 socket.on('message ', (room , data)=>{
79   logger.debug('message , room: ' + room + ", data , type:" + data.type);
80   socket.to(room).emit('message ',room , data);
81 });
82
83 // 用户加入房间
84 socket.on('join', (room)=>{
85   socket.join(room);
86   var myRoom = io.sockets.adapter.rooms[room];
87   var users = (myRoom)? Object.keys(myRoom.sockets).length : 0;
88
89   logger.debug('the user number of room (' + room + ') is: '+ users);
90
91   // 如果房间里人未满
92   if(users < USERCOUNT){
93     // 发给除自己之外的房间内的所有人
94     socket.emit('joined ', room , socket.id);
95
96     // 通知另一个用户, 有人来了
97     if(users > 1){
98       socket.to(room).emit('otherjoin ', room , socket.id);
99    }
100 }else{ // 如果房间里人满了
101   socket.leave(room);
102   socket.emit('full', room , socket.id);
103 }
104 });
105
106 // 用户离开房间
107 socket.on('leave ', (room)=>{
108
109   // 从管理列表中将用户删除
110   socket.leave(room);
111
112   var myRoom = io.sockets.adapter.rooms[room];
113   var users = (myRoom)? Object.keys(myRoom.sockets).length : 0;
114   logger.debug('the user number of room is: ' + users);
115
116   // 通知其他用户有人离开了
117   socket.to(room).emit('bye', room , socket.id);
118
119   // 通知用户服务器已处理
120   socket.emit('leaved ', room , socket.id);
121
122   });
123 });
124
125 https_server.listen (443, '0.0.0.0 ');