コンテンツにスキップ

Top

WebRTCを使って動画配信(同一LAN内) その2

先ほど の記事だと1つのシグナリングサーバーにつき1配信しかできないというお粗末ぶりだった。

ここで、WebSocketのroomというライブラリを使うことで1つのシグナリングサーバーだけれどもルームが違えばそれぞれ配信できる、というふうに改造する。

シグナリングサーバの改造

その1で作ったシグナリングサーバーを以下のように改造する。

signaling_server.js

const PORT = 8443;

const express = require('express');
const cors    = require('cors');    // Cross-Origin Resource Sharing(CORS)
const fs      = require('fs');      // 証明書を読み込むのに使う
const https   = require('https');

const app = express();
app.use(express.static('public'));
app.use(cors());

// keyとかcertとかの文字列は決められたものなので変更しないこ
// 昔はssl_server_keyとかssl_server_crtだったので古いWebサイトを参照してコピペするとアクセスできないので注意!
const options = {
  key  : fs.readFileSync('./server.key'),
  cert : fs.readFileSync('./server.crt'),
};
const server = https.createServer(options, app);
server.listen(PORT);
const io = require('socket.io')(server);

// connection はあらかじめ決められたお作法文字
// サーバとクライアントの接続が確立したとき、サーバー側では connection イベントが発生する
// (クライアント側は connect と、文字列が違うので要注意!)
io.on('connection', function(socket) {
  // roomに入る
  socket.on('enter', function(roomname) {
    socket.join(roomname);
    socket.roomname = roomname;
  });

  // 切断時にroomから出る処理を追加(disconnectは決められた予約語でクライアントからの切断時、例えばsocket.disconnect()時に勝手に呼ばれる。メッセージ的にemitされるものではない)
  socket.on('disconnect', function() {
    // 切断したことろroom内だけに通知
    socket.broadcast.to(socket.roomname).emit('user disconnected', {id: socket.id});

    // 部屋から出る
    socket.leave(socket.roomname);
  });

  // ブロードキャストメッセージにroom対応をする
  socket.on('message', function(message) {
    message.from = socket.id;

    // room内だけにブロードキャストするようtoを追加
    socket.broadcast.to(socket.roomname).emit('message', message);
  });
});

変更しているのは、 io.on('connection', function(socket) {}); の中身。
・'enter'が来たらsocketにルームを設定する
・'disconnect'が来たらsocketからルーム設定を取り除く
・socket.broadcast時に、to(socket.roomname) をつけてemitする
といった程度で大した変更ではない。

配信側と購読側にroomに入る処理を追加する

配信側と購読側の修正も軽微。
io.connect完了後に呼ばれる socket.on("connect", function (evt) {}を追記して、そこでenterをemitすればよいだけ。
(今回のプログラムでたまたまdisconnectが無いけど切断ボタンとか作ったらそこでdisconnectすればよい)

    socket = io.connect(signaling_server_url, {secure: true});

    socket.on("connect", function (evt) {
      socket.emit("enter", room);
    });

するだけ。

これで1つのシグナリングサーバーでroomごとに通信を発生させられるようになった。

以上!