- WebRTC音视频实时互动技术:原理、实战与源码分析
- 李超编著
- 718字
- 2021-08-06 14:49:35
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 ');