webRTC-NodeJS crea un directorio de servidor de señalización
Directorio de artículos
Prefacio
- Este artículo está extraído de "Learning WebRTC"
- Para crear una
WebRTC
aplicació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
WebRTC
conexión entre las dos partes - Una vez que el usuario llama a la otra parte, el servidor pasará la solicitud, la respuesta y la
ICE
ruta del candidato entre las dos partes.
- Permitir que los usuarios de una parte llamen a la otra parte para establecer una
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
-
WebRTC
Los pasos necesarios para establecer una conexión deben ser en tiempo real, y es mejor usarloWebSockets
.WebRTC
Los mensajes en tiempo real no se pueden entregar mediante una conexión de igual a igual -
Socket
Envíe información en ambas direcciones en forma de cadena y código binario -
Depende completamente del
WebSocket
marco:Meteor JavaScript framework
-
npm
Instalaciónwebsocket
:npm install ws
-
wscat
:npm 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
connection
eventos del lado del servidor , cuando el usuario establece unawebsocket
conexión con el servidor , este será llamado, y toda la información de la parte conectada. -
Instalación
wscat
de prueba:npm install -g ws
,wscat -c ws://localhost:8888
o 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 id
necesita 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));
}