官术网_书友最值得收藏!

4.4.5 信令服務器的完整代碼

通過上面的講解,相信大多數(shù)讀者完全能自己實現(xiàn)一個WebRTC一對一信令服務系統(tǒng)。不過對于新手來說,即使講解得再詳細,也不如有一個完整的例子做參考來得實際。為此我特意將信令服務器的完整代碼放在本章的最后作為參考,具體參見代碼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 // 一個房間里可以同時在線的最大用戶數(shù)
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 // 你的網(wǎng)站證書
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     // 發(fā)給除自己之外的房間內的所有人
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 ');

主站蜘蛛池模板: 陕西省| 嘉荫县| 龙游县| 茶陵县| 呼伦贝尔市| 秦皇岛市| 江北区| 张家口市| 三河市| 沅江市| 陕西省| 庆阳市| 辽源市| 和平区| 阳高县| 林周县| 岳普湖县| 托克逊县| 陇西县| 四会市| 浏阳市| 阳信县| 开平市| 巫山县| 达州市| 托克逊县| 蓬安县| 德保县| 资兴市| 崇明县| 山丹县| 南江县| 闸北区| 达孜县| 杭锦旗| 民乐县| 远安县| 丰县| 什邡市| 化隆| 大渡口区|