WebRTC學習(五)WebRTC信令服務器


一:使用socket.io發送消息

(一)socket.io服務端發送消息

broadcast會向站點中的所有房間發送消息

(二)socket.io客戶端處理消息

二:WebRTC信令服務器

(一)信令服務器(TCP)作用

1.媒體相關信息交換:發送SDP描述信息(是否支持音頻、視頻,已經對應的編解碼信息),通過信令服務器進行中轉(因為兩個客戶端之間還沒有建立P2P連接)。
2.網絡相關信息交換:建立P2P連接之前的雙方信息,也是通過信令服務器進行轉發。
3.具體業務信息:房間加入、離開、禁言等等

(二)為什么要使用socket.io(本身具有房間的概念)

(三)socket.io工作原理

三:socket.io實現通信服務器

(一)處理流程

對於客戶端連接到服務端以后,會在socket.io的底層觸發connection消息,所以服務器只需要處理connection消息

(二)實現通信服務器

socket.io版本降級,解決TypeError: socketIo.listen is not a function

'use strict'

var http = require("http");
var https = require("https");
var fs = require("fs");

var express = require("express");
var serveIndex = require("serve-index");

var socketIo = require("socket.io");    //引入socket.io

var log4js = require('log4js');            //開啟日志
var logger = log4js.getLogger();
logger.level = 'info';

var app = express();                    //實例化express
app.use(serveIndex("./"));        //設置首路徑,url會直接去訪問該目錄下的文件
app.use(express.static("./"));    //可以訪問目錄下的所有文件

//https server
var options = {
    key : fs.readFileSync("./ca/learn.webrtc.com-key.pem"),            //同步讀取文件key
    cert: fs.readFileSync("./ca/learn.webrtc.com.pem"),                //同步讀取文件證書
};

var https_server = https.createServer(options,app);
//綁定socket.io與https服務端
var io = socketIo.listen(https_server);    //io是一個節點(站點),內部有多個房間
https_server.listen(443,"0.0.0.0");
//---------實現了兩個服務,socket.io與https server;都是綁定在443,復用端口

//-----處理事件
io.sockets.on("connection",(socket)=>{    //處理客戶端到達的socket
    //監聽客戶端加入、離開房間消息
    socket.on("join",(room)=>{
        socket.join(room);                //客戶端加入房間
        //io.sockets指io下面的所有客戶端
        //如果是第一個客戶端加入房間(原本房間不存在),則會創建一個新的房間
        var myRoom = io.sockets.adapter.rooms[room];    //從socket.io中獲取房間
        var users = Object.keys(myRoom.sockets).length;    //獲取所有用戶數量

        logger.info("the number of user in room is:"+users);

        //開始回復消息,包含兩個數據房間和socket.id信息
        //socket.emit("joined",room,socket.id);    //給本人
        //socket.to(room).emit("joined",room,socket.id);    //給房間內其他所有人發消息
        //io.in(room).emit("joined",room,socket.id);        //給房間中所有人(包括自己)發送消息
        socket.broadcast.emit("joined",room,socket.id);    //給節點內其他所有人發消息
    });
    
    socket.on("leave",(room)=>{
        var myRoom = io.sockets.adapter.rooms[room];    //從socket.io中獲取房間
        var users = Object.keys(myRoom.sockets).length;    //獲取所有用戶數量

        logger.info("the number of user in room is:"+(users-1));

        socket.leave(room);    //離開房間
        //開始回復消息,包含兩個數據房間和socket.id信息
        socket.broadcast.emit("leaved",room,socket.id);    //給節點內其他所有人發消息
    });

    socket.on("message",(room,msg)=>{
        var myRoom = io.sockets.adapter.rooms[room];    //從socket.io中獲取房間
        logger.info("send data is:"+msg);

        socket.broadcast.emit("message",room,socket.id,msg);    //給節點內其他所有人發消息
    });
});
server.js

使用:node server.js啟動

<html>
    <head>
        <title>    Chat Room </title>
    </head>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
    <body>
        <h1>Chat Room</h1>
        <table align="left">
            <tr>
                <td>
                    <label>UserName:</label>
                    <input type="text" id="username"/>
                </td>
            </tr>
            <tr>
                <td>
                    <label>Room:</label>
                    <input type="text" id="room"/>
                    <button id="connect">Connect</button>
                    <button id="leave" disabled>Leave</button>
                </td>
            </tr>
            <tr>
                <td>
                    <label>Content:</label><br/>
                    <textarea disabled id="output" rows="10" cols="50"></textarea>
                </td>
            </tr>            

            <tr>
                <td>
                    <label>Input:</label><br/>
                    <textarea disabled id="input" rows="3" cols="50"></textarea>
                </td>
            </tr>    
            <tr>
                <td>
                    <button id="send">Send</button>
                </td>
            </tr>
        </table>
    </body>
    <script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
    <script type="text/javascript" src="./js/chat.js"></script>
    
</html>
ChatRoo..html
'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 = ()=>{
    console.log("connect.....");
    //1.connect
    //當客戶端成功加載socket.io客戶端文件后會獲取到一個全局對象io,我們將通過io.connect函數來向服務端發起連接請求。由html中的script引入
    socket = io.connect();    

    //2.receive message,連接后,添加事件來處理服務端發送的消息
    socket.on("joined",(room,id)=>{
        console.log("joined.....");
        btnConnect.disabled = true;
        inputArea.disabled = false;
        btnSend.disabled = false;
        btnLeave.disabled = false;
    });

    socket.on("leaved",(room,id)=>{
        console.log("leaved.....");
        btnConnect.disabled = false;
        inputArea.disabled = true;
        btnSend.disabled = true;
        btnLeave.disabled = true;
        userName.value = "";
        inputRoom.value = "";
    });

    socket.on("message",(room,id,data)=>{
        outputArea.value = outputArea.value + data +'\r';
    });

    //3.send message,加入房間(順序可以和2交換)
    room = inputRoom.value;
    socket.emit("join",room);
};

btnLeave.onclick = ()=>{
    socket.emit("leave",room);
}

btnSend.onclick = ()=>{
    var data = inputArea.value;
    data = userName.value + ":" +data;
    socket.emit("message",room,data);
};
chat.js

 

有bug!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM