webrtc初体验

210 阅读2分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

信令服务器

webrtc的使用需要通过信令服务器进行信令的数据交互,这时候我们就需要一个服务器,对前端来说使用Nodejs是一个很不错的选择,除此之外还可以使用Apache,Nginx。

具体操作步骤

1.安装Nodejs和NPM

这两步一般前端的电脑上都有,就不说怎么安装了,可以通过node -v和npm -v来查看电脑上是否安装成功了

2.使用socket.io库

使用 Nodejs 下的 socket.io 库来实现 WebRTC 信令服务器,因为它内置的有‘房间’这个概念,正好和我们的多人通话类似

3.搭建服务器

创建index.html:

<!DOCTYPE html>
<html>
 <head>
 <title>WebRTC client</title>
 </head>
 <body>
 <script src='/socket.io/socket.io.js'></script>
 <script src='js/client.js'></script>
 </body>
</html>

4.创建一个js文件夹用来放clients.js

var isInitiator;

room = prompt('Enter room name:'); //弹出一个输入窗口

const socket = io.connect(); //与服务端建立socket连接

if (room !== '') { //如果房间不空,则发送 "create or join" 消息
 console.log('Joining room ' + room);
 socket.emit('create or join', room);
}

socket.on('full', (room) => { //如果从服务端收到 "full" 消息
 console.log('Room ' + room + ' is full');
});

socket.on('empty', (room) => { //如果从服务端收到 "empty" 消息
 isInitiator = true;
 console.log('Room ' + room + ' is empty');
});

socket.on('join', (room) => { //如果从服务端收到 “join" 消息
 console.log('Making request to join room ' + room);
 console.log('You are the initiator!');
});

socket.on('log', (array) => {
 console.log.apply(console, array);
});

5.js同目录下创建server.js

const static = require('node-static');
const http = require('http');
const file = new(static.Server)();
const app = http.createServer(function (req, res) {
  file.serve(req, res);
}).listen(2013);

const io = require('socket.io')(app); //侦听 2013

io.sockets.on('connection', (socket) => {

  // convenience function to log server messages to the client
  function log(){ 
    const array = ['>>> Message from server: ']; 
    for (var i = 0; i < arguments.length; i++) {
      array.push(arguments[i]);
    } 
      socket.emit('log', array);
  }

  socket.on('message', (message) => { //收到message时,进行广播
    log('Got message:', message);
    // for a real app, would be room only (not broadcast)
    socket.broadcast.emit('message', message); //在真实的应用中,应该只在房间内广播
  });

  socket.on('create or join', (room) => { //收到 “create or join” 消息

    var clientsInRoom = io.sockets.adapter.rooms[room];
    var numClients = clientsInRoom ? Object.keys(clientsInRoom.sockets).length : 0; //房间里的人数

    log('Room ' + room + ' has ' + numClients + ' client(s)');
    log('Request to create or join room ' + room);

    if (numClients === 0){ //如果房间里没人
      socket.join(room);
      socket.emit('created', room); //发送 "created" 消息
    } else if (numClients === 1) { //如果房间里有一个人
      io.sockets.in(room).emit('join', room);
      socket.join(room);
      socket.emit('joined', room); //发送 “joined”消息
    } else { // max two clients
      socket.emit('full', room); //发送 "full" 消息
    }
    socket.emit('emit(): client ' + socket.id +
      ' joined room ' + room);
    socket.broadcast.emit('broadcast(): client ' + socket.id +
      ' joined room ' + room);

  });

});

6.通过npm安装socket.io和node-static库

npm install socket.io

npm install node-static

7.启动服务

node server.js

不出意外的话会出错,报错提示# sokcet var io = require(‘socket.io‘).listen(server); not a function,这是因为socket.io版本是3.0以上,这里边不在使用listen()方法,所以把socket.io降为2.*版本即可

npm i socket.io@2.0.3

7.打开浏览器测试

在浏览器中输入 localhost:2013 ,然后新建一个tab 在里边再次输入localhost:2013 。如果在浏览器看到如下内容则说明成功

image.png