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ごとに通信を発生させられるようになった。
以上!