• WebRTC信令服务器的搭建


    WebRTC简介中提到信令服务器用于向中端传输数据,信令服务器是实现两个webRTC中端通信的重要角色。今天就来实现一下信令服务器。

    作为前端开发对于后端的东西不是很熟悉,只能使用现成的一些服务器软件和nodejs来搭建信令服务器。

    业务逻辑

    当两个用户要进行通信时,他们首先要创建一个房间,成功加入房间之后,双方才能交换必要的信息。

    当通信的双方结束通话后,用户需要发送离开房间的消息给信令服务器,此时信令服务器需要将房间内的所有人清除;如果房间里已经没有人了,还需要将空房间销毁掉。

    这样的逻辑socket.io已经帮我们实现了,我们只需要使用就行,不需要自己重新开发。

    因此,我们使用nodejs+express+socket.io实现信令服务器。

    1. 创建服务器
    const http = require('http');//引入http库
    const express = require('express'); //引入express库
    
    //创建HTTP服务,并侦听8980端口
    const app = express();
    const http_server = http.createServer(app);
    http_server.listen(8080, '0.0.0.0');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    首先,通过express创建一个Web应用;之后调用HTTP库的createServer()方法创建HTTP对象,即http_server;最后调用http_server对象的listen()方法侦听8080端口。通过上面的步骤就实现了一个HTTP服务。

    1. 注册socket.io的回调函数
    io.sockets.on('connection', (socket) => {
    
      //收到message时,进行转发
      socket.on('message', (message) => {
        //给另一端转发消息
        socket.to(room).emit('message', message);
    
      });
    
      //收到 join 消息
      socket.on('join', (room) => {
        var o = io.sockets.adapter.rooms[room];
        //得到房间里的人数
        var nc = o ? Object.keys(o.sockets).length : 0;
        if (nc < 2) { //如 果 房 间中 没 有 超 过 2 人
          socket.join(room);
          //发 送 joined消 息
          socket.emit('joined', room);
        } else { // max two clients
          socket.emit('full', room); //发 送 full 消 息
        }
      });
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    所有消息的处理都是在客户端与服务器建立连接之后进行的,因此,需要提前将connection消息的处理函数注册到socket.io中。

       io.sockets.on('connection', (socket) => {
       	//收到message时,进行转发
      	socket.on('message', (message) => {
      
       		//给另一端转发消息
      		socket.to(room).emit('message', message);
      	});
      
      	//收到 join 消息
       	socket.on('join', (room) => {
      	var o = io.sockets.adapter.rooms[room];
      
      	//得到房间里的人数
      	var nc = o ? Object.keys(o.sockets).length : 0;
      	if (nc < 2){ //如 果 房 间中 没 有 超 过 2 人
      		socket.join(room);
      
     		//发 送 joined消 息
      		socket.emit('joined', room);
      	} else { // max two clients
     		socket.emit('full', room); //发 送 full 消 息
       	}
      }
     });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    如果服务端收到message消息,它不做任何处理,直接进行转发。
    如果是join消息,则首先将用户加入服务端管理的房间中,之后向客户端返回joined消息。
    如果用户加入时房间里已经有两个用户了,则拒绝该用户的加入,并返回full消息,以告之目前房间里人已经满了,如果有其他的需求可以自行监听其他的事件进行操作。

  • 相关阅读:
    MySQL - Explain详解
    聚乙二醇修饰单分散/功能化聚乙烯胺/热敏性PNVIBA/温敏性PNIPAAm接枝聚苯乙烯微球
    数据结构——树(树的概念、优缺点、二叉树)
    java:详解常用的pom.xml配置
    Vue 3 第二十二章:组件十(组件高级特性-组件的渲染函数和JSX/TSX语法)
    bugku-web-安慰奖
    Java可变参数和不可变集合
    五笔字根查询接口,五笔输入法数据
    C++多态(超级详细版)
    将docker打包成镜像并保存到本地
  • 原文地址:https://blog.csdn.net/qq_40850839/article/details/127972514