一:使用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); //給節點內其他所有人發消息 }); });
使用: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>

'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); };
有bug!!!