Nodejs+socket.io создает сигнальный сервер WebRTC

WebRTC

предисловие

мы учимсяWebRTCКогда , мы должны сначала настроить экспериментальную среду, чтобы мы могли проводить в ней различные эксперименты.

Для WebRTC у него есть целый набор спецификаций, таких как используемый интерфейс, согласование мультимедиа с использованием SDP, сбор адресов через ICE и обнаружение подключения и т. д. Кроме того, WebRTC также требует, чтобы комнатный сервер управлял несколькими терминалами вместе, а сигнальный сервер — для обмена сигнальными данными (такими как обмен информацией описания мультимедиа SDP, обмен адресами подключения и т. д.), но в спецификации WebRTC Эта часть контента не указана, поэтому ее должен обрабатывать пользователь.

Вы можете выбрать сервер (например, Apache, Nginx или Nodejs) в соответствии с вашими предпочтениями, и сегодня я расскажу, как использовать Nodejs для создания сервера сигнализации.

Почему выбирают Nodejs

Apache, Nginx и Nodejs — очень зрелые веб-серверы, и можно сказать, что Nginx — лучший веб-сервер с точки зрения производительности. Но в будущем у Nodejs может быть больше преимуществ.

Теперь браузеры, представленные Chrome, становятся все более и более мощными, и вещи, которые раньше считались невозможными с помощью браузеров, теперь могут быть легко достигнуты. Появление H5, WebSocket и добавление WebRTC теперь заставляют всех все больше и больше чувствовать, что браузеры будущего можно назвать «всемогущими». Поэтому развитие языка JavaScript продвигается все быстрее и быстрее. Это подтверждается популярностью технологии JavaScript и появлением различных JS FrameWorks.

Самым большим преимуществом Nodejs является то, что он может использовать язык JS для разработки серверных программ. Таким образом, большое количество фронтенд-студентов может беспрепятственно переключиться на серверную разработку, и даже возможно, что фронтенд и бэкэнд используют один и тот же набор кодов. Я думаю, что это большое искушение как для частных лиц, так и для бизнеса.

  • С одной стороны, простота языка JS может облегчить разработку серверных программ с различными функциями.

  • Что более ценно, так это то, что экологическая цепочка Nodejs очень полная, и есть различные функциональные библиотеки. Вы можете быстро установить его через инструмент установки NPM в соответствии с вашими потребностями, что также делает его популярным среди разработчиков.

Nodejs в настоящее время является очень популярным веб-сервером, он использует движок V8 (JavaScript) на стороне сервера, с помощью которого он анализирует сценарии JS для управления поведением сервера. Это очень радует большинство изучающих JS, ведь 10 лет назад было сложно представить, что можно было писать серверные программы на языке сценариев JS.

Конечно, если вы хотите расширить возможности Nodejs, вам все равно придется написать библиотеку C/C++ и загрузить ее в Nodejs.

Основы Nodejs

Принцип работы Nodejs показан на рисунке выше, а его ядром является двигатель V8. С помощью этого движка js может вызывать методы или объекты C/C++. И наоборот, также можно предоставить C/C++ доступ к методам и переменным javascript.

Nodejs сначала передает приложение, написанное на JavaScript, движку V8 для анализа.После того как V8 понимает семантику приложения, он вызывает базовый C/C++ API Nodejs для запуска службы. Таким образом, сила Nodejs заключается в том, что js может напрямую вызывать методы C/C++, так что его возможности можно бесконечно расширять.

Возьмем в качестве примера разработку службы HTTP. После того, как Nodejs откроет порт службы прослушивания, нижний уровень вызовет libuv для обработки всех HTTP-запросов на порту. Его обработка сетевых событий показана на следующем рисунке:

Когда приходит сетевой запрос, он сначала будет вставлен в очередь обработки событий. libuv будет следить за очередью событий. Когда событие найдено, он сначала оценивает запрос. Если это простой запрос, он возвращает ответ напрямую, если это сложный запрос, он берет поток из пула потоков. для асинхронной обработки;

После обработки потока возможны две возможности: во-первых, он был обработан, и пользователю отправлен ответ; во-вторых, требуется дальнейшая обработка, и генерируется другое событие, которое вставляется в очередь событий для обработки. ; обработка событий такова: Цикл продолжается и продолжается, никогда не останавливаясь.

Два двигателя V8

Как показано на изображении выше, на самом деле есть два двигателя V8 после того, как мы используем Nodejs. Серверное JS-приложение V8, выполняющее синтаксический анализ и запускающее службу. Другой V8 — это механизм V8 в браузере, который управляет поведением браузера.

Новичкам, использующим Nodejs, легко запутаться, ведь на стороне сервера нужно разместить как минимум два JS-скрипта. Одна из них — серверная программа, управляющая поведением Nodejs, которая анализируется и обрабатывается движком V8 Nodejs; другая — клиентская программа, которая отправляется в браузер после запроса браузером, а V8 двигатель в браузере отправит его в браузер.Выполните обработку синтаксического анализа. Если вы не видите разницы, у вас большие проблемы.

Установить Node.js

Давайте подробно рассмотрим, как установить Nodejs.

Установить Nodejs очень просто:

Выполнить в системе Ubuntu:

apt install nodejs

Или запустите на Mac:

brew install nodejs

Выполнив описанные выше шаги, мы установили Nodejs. Версия Nodejs, которую я установил здесь:v8.10.0.

установить нпм

Помимо установки Nodejs, нам также необходимо установить NPM (диспетчер пакетов Node), который является менеджером пакетов Nodejs. Она похожа на apt в Ubuntu или команду brew в системе Mac и специально используется для управления различными зависимыми библиотеками.

Прежде чем они появятся, у нас должно быть много проблем с установкой пакета. Возьмем Linux в качестве примера, предположим, что вы хотите установить инструмент, основные шаги таковы:

  • Сначала загрузите исходный код этого инструмента.
  • Выполните ./configure, чтобы сгенерировать Makefile.
  • Выполните команду make, чтобы скомпилировать его.
  • Наконец, выполните make install, чтобы установить его в указанный каталог.
  • Если в процессе компиляции обнаружена зависимая библиотека, выполните первые 4 шага для зависимой библиотеки, то есть сначала установите зависимую библиотеку, а затем установите инструмент.

Вы можете видеть, как проблематично было установить программу или инструмент под Linux.

С apt в Linux все стало проще. Нам просто нужно выполнить команду apt install xxx, которая поможет вам выполнить вышеуказанные операции.

То же самое и с установочным пакетом Nodejs, NPM эквивалентен apt под Linux, его появление значительно повысило эффективность работы людей.

Установить NPM так же просто, как установить Nodejs:

Выполнить под Ubuntu:

apt install npm

Или выполнить под Mac:

brew install npm

socket.io

На этот раз мы используем библиотеку socket.io под Nodejs для реализации сервера сигнализации WebRTC. socket.io особенно подходит для разработки сигнального сервера для WebRTC, через него очень легко построить сигнальный сервер, в основном потому, что он имеет встроенныйНомерКонцепция чего-либо.

На приведенном выше рисунке показана логическая диаграмма взаимосвязей socket.io, используемая с Nodejs, и ее логика очень проста. socket.io разделен на две части: серверную и клиентскую. Сервер загружается Nodejs и прослушивает сервисный порт.Если клиент хочет подключиться к серверу, он должен сначала загрузить клиентскую библиотеку socket.io, а затем вызватьio.connect();подключен к серверу.

Особое внимание уделяется отправке и получению сообщений socket.io. У Socket.io есть много способов отправки сообщений, наиболее распространенными из которых являются следующие, которые мы должны удерживать:

  • Отправить сообщение этому соединению

    socket.emit()
    
    
  • Сообщение всем в комнате

    io.in(room).emit()
    
    
  • Отправить сообщение всем в комнате, кроме этой ссылки

    socket.to(room).emit()
    
    
  • В дополнение к этой ссылке отправлять сообщения всем людям

    socket.broadcast.emit()
    

Как должно быть получено сообщение?

  • отправить командную команду

    S: socket.emit('cmd’);
    C: socket.on('cmd',function(){...});
    
  • Отправлена ​​командная команда с данными data

    S: socket.emit('action', data);
    C: socket.on('action',function(data){...});
    
  • Командная команда отправлена, и есть два данных

    S: socket.emit(action,arg1,arg2);
    C: socket.on('action',function(arg1,arg2){...});
    

Обладая вышеуказанными знаниями, мы можем реализовать передачу данных сигнализации.

Построить сигнальный сервер

Далее рассмотрим, как собрать сервер через socket.io под Nodejs:

Это клиентский код, то есть код, который выполняется в браузере. индекс.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>

Код очень простой, то есть в тело вводятся два куска JS-кода. Среди них socket.io.js используется для установления сокетного соединения с сервером. Роль client.js состоит в том, чтобы выполнить некоторую бизнес-логику и, наконец, связаться с сервером через сокет.

Вот код client.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);
});

В этом коде:

  • Сначала появляется окно ввода, предлагающее пользователю написать в комнате, чтобы присоединиться.
  • Затем установите соединение с сервером через io.connect(),
  • Выполните различную обработку в соответствии с сообщением, возвращаемым сокетом:
    • Случай, когда полученный номер заполнен «полностью»;
    • Ситуация, когда комната пуста «пусто»;
    • Случай, когда получено соединение "join";

Выше приведен код, который выполняется на стороне клиента (то есть в браузере). Давайте посмотрим на логику обработки на стороне сервера:

Серверный код, 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').listen(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);

  });

});

представлен на сервереnode-staticБиблиотеки, позволяющие серверу публиковать статические файлы. После того, как у сервера есть эта функция, когда клиент (браузер) инициирует запрос к серверу, сервер получает код, запускаемый клиентом (браузером) через этот модуль, то есть упомянутые выше index.html и client.html. .js и отправить его клиенту (браузеру).

Сервер прослушивает порт 2013 и соответственно обрабатывает разные сообщения:

  • Когда сервер получает сообщение-сообщение, оно будет транслироваться напрямую, и все клиенты, подключенные к серверу, получат широковещательное сообщение.
  • Когда сервер получает сообщение «создать или присоединиться», он подсчитает количество людей в комнате.Если в комнате никого нет, он отправит сообщение «создано», если в комнате есть один человек, он отправит сообщение «присоединиться» и сообщение «присоединился».сообщение, если есть более двух человек, отправить «полное» сообщение.

Для запуска программы необходимо установить socket.io и socket.io с помощью NPM.node-static, способ установки следующий:

npm install socket.io
npm install node-static

Запустите сервер и проверьте

Выполнив описанные выше шаги, мы создали сервер с помощью socket.io, и теперь мы можем запустить службу с помощью следующей команды:

node server.js

Если вы создаете службу на этой машине, вы можете ввести в браузере localhost:2013, затем создать новую вкладку и снова ввести в нее localhost:2013. В этот момент откройте консоль, чтобы посмотреть, что произошло?

В Chrome вы можете использовать сочетание клавиш Command-Option-J или Ctrl-Shift-J для DevTools для доступа к консоли.

резюме

Выше я представил принцип работы Nodejs, установку и развертывание Nodejs, а также то, как использовать sokcet.io для создания сервера сигнальных сообщений WebRTC. Socket.io очень совместим с WebRTC благодаря концепции комнат, и его очень удобно использовать для разработки сигнального сервера WebRTC.

Кроме того, пример в этой статье является простым примером и не имеет большой практической ценности. в моем«Внедрение и реальное сражение технологии интерактивных прямых трансляций WebRTC в реальном времени»В классе, основанном на приведенном выше примере, я научу вас, как шаг за шагом реализовать сигнальный сервер WebRTC, и сотрудничать с WebRTC для реализации системы интерактивной прямой трансляции аудио и видео в режиме реального времени 1-к-1.

Адрес курса

Внедрение и реальное сражение технологии интерактивных прямых трансляций WebRTC в реальном времени