Nodejs搭建音視頻通訊-信令服務器 總結

一、安裝nodejs  node-v10.16.3-x64.msi

二、安裝配置環境變量css

  這裏的環境配置主要配置的是npm安裝的全局模塊所在的路徑,以及緩存cache的路徑,之因此要配置,是由於之後在執行相似:npm install express [-g] (後面的可選參數-g,g表明global全局安裝的意思)的安裝語句時,會將安裝的模塊安裝到【C:\Users\用戶名\AppData\Roaming\npm】路徑中,佔C盤空間。例如:我但願將全模塊所在路徑和緩存路徑放在我node.js安裝的文件夾中,則在我安裝的文件夾【D:\Develop\nodejs】下建立兩個文件夾【node_global】及【node_cache】。html

  建立完這兩個空文件夾以後,打開cmd命令窗口,輸入:node

  npm config set prefix "D:\Develop\nodejs\node_global"ajax

       npm config set cache "D:\Develop\nodejs\node_cache"express

 

 

  接下來設置環境變量,關閉cmd窗口,「個人電腦」-右鍵-「屬性」-「高級系統設置」-「高級」-「環境變量」:npm

  備註:使用npm install -g 'xxx' 以後仍然報Cannot find module 'xxx' 錯誤,能夠經過設置環境變量NODE_PATH來解決。瀏覽器

  在系統目錄中找到C:\Users\Administrator\.npmrc文件 修改以下便可:緩存

          prefix =D:\Develop\nodejs\node_global 
          cache =D:\Develop\nodejs\node_cache
  配置完後,安裝幾個module測試下,咱們就安裝最經常使用的express模塊,打開cmd窗口,輸入以下命令進行模塊的全局安裝: npm install express -g # -g是全局安裝的意思

三、自簽名的https證書 服務器

  openssl genrsa -out 1557605_www.learningrtc.cn.key 2048//這是祕鑰(生成祕鑰文件)
  openssl req -new -sha256 -key 1557605_www.learningrtc.cn.key -out csr.pem//簽名請求文件(申請者須要將本身的信息及其公鑰放入證書請求中。但在實際操做過程當中,所須要提供的是私鑰而非公鑰,由於它會自動從私鑰中提取公鑰)
  openssl x509 -req -in csr.pem -signkey 1557605_www.learningrtc.cn.key -out 1557605_www.learningrtc.cn.pem//這是證書
app

四、信令服務器主要代碼

    server.js文件

'use strict'

var log4js = require('log4js'); var http = require('http'); var https = require('https'); var fs = require('fs'); var socketIo = require('socket.io'); var express = require('express'); var serveIndex = require('serve-index'); var USERCOUNT = 3; log4js.configure({ appenders: { file: { type: 'file', filename: 'app.log', layout: { type: 'pattern', pattern: '%r %p - %m', } } }, categories: { default: { appenders: ['file'], level: 'debug' } } }); var logger = log4js.getLogger(); var app = express(); app.use(serveIndex('./public')); //node server.js啓動後,項目的根目錄在public文件夾下(public文件夾和server.js文件在同一個目錄下,public文件夾下有index.html文件、css文件和js文件夾等) app.use(express.static('./public')); //http server
var http_server = http.createServer(app); http_server.listen(80, '0.0.0.0'); var options = { key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'), //https祕鑰,放在cert文件夾下 cert: fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem') //https證書,放在cert文件夾下 } //https server
var https_server = https.createServer(options, app); var io = socketIo.listen(https_server); io.sockets.on('connection', (socket)=> { socket.on('message', (room, data)=>{ logger.debug('message, room: ' + room + ", data, type:" + data.type); socket.to(room).emit('message',room, data); }); /* socket.on('message', (room)=>{ logger.debug('message, room: ' + room ); socket.to(room).emit('message',room); }); */ socket.on('join', (room)=>{ socket.join(room); var myRoom = io.sockets.adapter.rooms[room]; var users = (myRoom)? Object.keys(myRoom.sockets).length : 0; logger.debug('the user number of room (' + room + ') is: ' + users); if(users < USERCOUNT){ socket.emit('joined', room, socket.id); //發給除本身以外的房間內的全部人
            if(users > 1){ socket.to(room).emit('otherjoin', room, socket.id); } }else{ socket.leave(room); socket.emit('full', room, socket.id); } //socket.emit('joined', room, socket.id); //發給本身
        //socket.broadcast.emit('joined', room, socket.id); //發給除本身以外的這個節點上的全部人
        //io.in(room).emit('joined', room, socket.id); //發給房間內的全部人
 }); socket.on('leave', (room)=>{ socket.leave(room); var myRoom = io.sockets.adapter.rooms[room]; var users = (myRoom)? Object.keys(myRoom.sockets).length : 0; logger.debug('the user number of room is: ' + users); //socket.emit('leaved', room, socket.id);
        //socket.broadcast.emit('leaved', room, socket.id);
        socket.to(room).emit('bye', room, socket.id); socket.emit('leaved', room, socket.id); //io.in(room).emit('leaved', room, socket.id);
 }); }); https_server.listen(8443, '0.0.0.0');

index.html文件:

<html>
    <head>
        <title>Chat Room</title>
        <link rel="stylesheet" href="./css/main.css"></link>
    </head>
    <body>
        <table align="center">
            <tr>
                <td>
                    <label>UserName: </label>
                    <input type=text id="username"></input>
                </td>
            </tr>
            <tr>
                <td>
                    <label>room: </label>
                    <input type=text id="room"></input>
                    <button id="connect">Conect</button>
                    <button id="leave" disabled>Leave</button>
                </td>
            </tr>
            <tr>
                <td>
                    <label>Content: </label><br>
                    <textarea disabled style="line-height: 1.5;" id="output" rows="10" cols="100"></textarea>
                </td>
            </tr>
            <tr>
                <td>
                    <label>Input: </label><br>
                    <textarea disabled id="input" rows="3" cols="100"></textarea>
                </td>
            </tr>
            <tr>
                <td>
                    <button id="send">Send</button>
                </td>
            </tr>
        </table>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
        <script src="./js/client.js"></script> 
    </body>

</html>

client.js文件:

'use strict'

var userName = document.querySelector('input#username'); var inputRoom = document.querySelector('input#room'); var btnConnect = document.querySelector('button#connect'); var btnLeave = document.querySelector('button#leave'); var outputArea = document.querySelector('textarea#output'); var inputArea = document.querySelector('textarea#input'); var btnSend = document.querySelector('button#send'); var socket; var room; btnConnect.onclick = ()=>{ //connect
    socket = io.connect(); //recieve message
    socket.on('joined', (room, id) => { btnConnect.disabled = true; btnLeave.disabled = false; inputArea.disabled = false; btnSend.disabled = false; alert("room:"+room + ",id:"+id); }); socket.on('leaved', (room, id) => { btnConnect.disabled = false; btnLeave.disabled = true; inputArea.disabled = true; btnSend.disabled = true; socket.disconnect(); }); socket.on('message', (room, data) => { outputArea.scrollTop = outputArea.scrollHeight;//窗口老是顯示最後的內容
        outputArea.value = outputArea.value + data + '\r'; }); socket.on('disconnect', (socket)=>{ btnConnect.disabled = false; btnLeave.disabled = true; inputArea.disabled = true; btnSend.disabled = true; }); //send message
    room = inputRoom.value; socket.emit('join', room); } btnSend.onclick = ()=>{ var data = inputArea.value; data = userName.value + ':' + data; socket.emit('message', room, data); inputArea.value = ''; } btnLeave.onclick = ()=>{ room = inputRoom.value; socket.emit('leave', room); } inputArea.onkeypress = (event)=> { //event = event || window.event;
    if (event.keyCode == 13) { //回車發送消息
    var data = inputArea.value; data = userName.value + ':' + data; socket.emit('message', room, data); inputArea.value = ''; event.preventDefault();//阻止默認行爲
 } }

五、啓動服務

    cmd窗口,進入項目位置,輸入:node server.js   啓動服務。

    Chrome瀏覽器和360極速瀏覽器,頁面分別輸入https://localhost:8443/index.html,加入同一個房間,能夠發送聊天信息,房間裏的用戶能夠識別到新加入的用戶(收到join等消息)。


參考地址:
https://blog.csdn.net/u012853084/article/details/79089946

https://blog.csdn.net/paulowina/article/details/78591432

https://blog.csdn.net/abccheng/article/details/82622899

https://www.iteye.com/blog/freeman983-1350861

相關文章
相關標籤/搜索