webRTC-NodeJS crea un servidor de señalización

webRTC-NodeJS crea un directorio de servidor de señalización


Prefacio

  • Este artículo está extraído de "Learning WebRTC"
  • Para crear una WebRTCaplicación completa , debe dejar de lado el desarrollo del lado del cliente y pasar al desarrollo del lado del servidor.

Lectura recomendada

  • 《Aprendiendo WebRTC》

Construye un servidor de señalización

  • Conecta dos usuarios que no están en la misma computadora
  • El propósito del servidor es reemplazar el mecanismo de señalización original a través de la transmisión de red.
  • Respondiendo a múltiples usuarios:
    • Permitir que los usuarios de una parte llamen a la otra parte para establecer una WebRTCconexión entre las dos partes
    • Una vez que el usuario llama a la otra parte, el servidor pasará la solicitud, la respuesta y la ICEruta del candidato entre las dos partes.

Inserte la descripción de la imagen aquí

Proceso

  • Flujo de información cuando el servidor establece una conexión
  • Inicie sesión en el servidor, inicie sesión y envíe una identificación de usuario en forma de cadena al servidor para asegurarse de que no se utilice
  • Inicie sesión, comience a llamar, envíe la solicitud utilizando el código de identificación de la otra parte
  • Envíe un mensaje de permiso para terminar la conexión
  • Este proceso se utiliza principalmente como canal para enviarse información entre sí.

Nota

  • Dado que no existen reglas para la realización de la señalización, se puede utilizar cualquier protocolo, tecnología o modo

WebSockets

  • WebRTCLos pasos necesarios para establecer una conexión deben ser en tiempo real, y es mejor usarlo WebSockets. WebRTCLos mensajes en tiempo real no se pueden entregar mediante una conexión de igual a igual

  • SocketEnvíe información en ambas direcciones en forma de cadena y código binario

  • Depende completamente del WebSocketmarco:Meteor JavaScript framework

  • npmInstalación websocket:npm install ws

  • wscatnpm install wscat

server.js

const WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({
    
    port: 8888});

wss.on("connection", connection => {
    
    
    console.log("User connected");

    connection.on("message", message => {
    
    
        console.log("Got message:", message);
    });

    connection.send("hello world!")
});
  • Monitorear los connectioneventos del lado del servidor , cuando el usuario establece una websocketconexión con el servidor , este será llamado, y toda la información de la parte conectada.

  • Instalación wscatde prueba: npm install -g ws, wscat -c ws://localhost:8888o FeExperiment

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let websocket = new WebSocket("ws://localhost:8888");

    </script>
</body>
</html>

Identificar usuarios

  • En una aplicación de red típica, el servidor necesita una forma de identificar al usuario conectado
  • Siga las reglas únicas, permita que cada usuario tenga una forma de identificación de cadena, es decir, el nombre de usuario

Solo se idnecesita uno para identificar

const WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({
    
    port: 8888});

wss.on("connection", connection => {
    
    
    console.log("User connected");

    connection.on("message", message => {
    
    
        // console.log("Got message:", message);
        let data;

        try{
    
    
            data = JSON.parse(message);
        }catch(e) {
    
    
            console.log(e);
            data = {
    
    };
        }
    });

    connection.send("hello world!")
});

Servidor de señalización completo

const WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({
    
    port: 8888}),
    users = {
    
    };

wss.on("connection", connection => {
    
    
    console.log("User connected");

    connection.on("message", message => {
    
    
        // console.log("Got message:", message);
        let data, conn;

        try{
    
    
            data = JSON.parse(message);
        }catch(e) {
    
    
            console.log(e);
            data = {
    
    };
        }


        switch(data.type) {
    
    
            case "login":
                console.log("User logged in as", data.name);
                if(users[data.name]) {
    
    
                    sendTo(connection, {
    
    
                        type: "login",
                        success: false
                    });
                }else {
    
    
                    users[data.name] = connection;
                    connection.name = data.name;
                    sendTo(connection, {
    
    
                        type: "login",
                        success: true
                    });
                }
                break;
            
            case "offer":
                console.log("sending offer to:", data.name);
                conn = users[data.name];

                if(conn != null){
    
    
                    connection.otherName = data.name;
                    sendTo(conn, {
    
    
                        type: "offer",
                        offer: data.offer,
                        name: connection.name
                    });
                }
                break;

            case "answer":
                console.log("sending answer to:", data.name);
                conn = users[data.name];

                if(conn != null){
    
    
                    connection.otherName = data.name;
                    sendTo(conn, {
    
    
                        type: "answer",
                        answer: data.answer
                    })
                }
                break;

            case "candidate":
                console.log("sending to", data.name);
                conn = users[data.name];

                if(conn != null){
    
    
                    sendTo(conn, {
    
    
                        type: "candidate",
                        candidate: data.candidate
                    });
                }
                break;
            
            case "leave":
                console.log("Disconnected user from ", data.name);
                conn = users[data.name];
                conn.otherName = null;

                if(conn != null){
    
    
                    sendTo(conn, {
    
    
                        type: "leave"
                    });
                }
                break;
                
            default:
                sendTo(connection, {
    
    
                    type: "error",
                    message: "Unrecognized command: " + data.type
                });

                break;
        }
    });

});

wss.on("close", function(){
    
    
    if(connection.name){
    
    
        delete users[connection.name];

        if(connection.otherName) {
    
    
            console.log("Disconnected,",connection.otherName);
            let conn = users[connection.otherName];
            conn.otherName = null;

            if(conn != null){
    
    
                sendTo(conn,{
    
    
                    type: "leave"
                });
            }
        }
    }
});

wss.on("listening", () => {
    
    
    console.log("Server started...");
});

function sendTo(conn, message) {
    
    
    conn.send(JSON.stringify(message));
}

Supongo que te gusta

Origin blog.csdn.net/u013362192/article/details/115154499
Recomendado
Clasificación