1

NodeJS と WebRTC を使用して、1 対多のライブ ストリーミング アプリケーションのような単純なピア ツー ピア アプリを作成しました。

これまでのところ、ローカルホストで動作していますが、Google Cloud Platform の本番 VM サーバーにアプリをデプロイしたときに、peer.createDataChannel(). または、少なくともエラーがスローされていないため、それが問題です。

サーバー.js

const port = process.env.PORT || 80;

const express = require('express');
const bodyParser = require('body-parser');
const webrtc = require('wrtc');

const app = express();

const status = {
    offline: 'offline',
    online: 'online',
    streaming: 'streaming'
};

let hostStream;
let hostChannel;
let channelData = {
    status: status.offline,
    message: null
};

app.use(express.static('public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/broadcast', async ({ body }, res) => {
    try {
        let peer = new webrtc.RTCPeerConnection({
            iceServers: [
                {
                    urls: "stun:stun.stunprotocol.org"
                }
            ]
        });

        peer.ontrack = (e) => handleTrackEvent(e, peer);
        peer.ondatachannel = (e) => handleHostDataChannelEvent(e);

        let desc = new webrtc.RTCSessionDescription(body.sdp);
        await peer.setRemoteDescription(desc);

        let answer = await peer.createAnswer();
        await peer.setLocalDescription(answer);

        let payload = {
            sdp: peer.localDescription,
            status: channelData.status
        };

        res.json(payload);
    } catch (e) {
        console.log(e);
    }
});

function handleTrackEvent(e, peer) {
    hostStream = e.streams[0];
}

function handleHostDataChannelEvent(e) {
    let channel = e.channel;

    channel.onopen = function(event) {
        channelData.message = '[ SERVER ]: Peer-to-peer data channel has been created.';
        channel.send(JSON.stringify(channelData));
        channelData.message = null;
    }
    channel.onmessage = function(event) {
        console.log(event.data);
    }

    hostChannel = channel;
}

app.listen(port, () => console.log('[ SERVER ]: Started'));

streamer.js

function createPeer() {
    let peer = new RTCPeerConnection({
        iceServers: [
            {
                urls: "stun:stun.stunprotocol.org"
            }
        ]
    });

    let channel = peer.createDataChannel('host-server');
    channel.onopen = function(event) {
        channel.send('Host: Data Channel Opened');
    }
    channel.onmessage = function(event) {
        let data = JSON.parse(event.data);

        if('status' in data) {
            $('body').removeClass().addClass(data.status);
        }

        if('message' in data && data.message != null) {
            $.toast({
                heading: 'Data Channel',
                text: data.message,
                showHideTransition: 'slide',
                icon: 'info',
                position: 'top-center',
                stack: false
            })
        }
    }

    peer.onnegotiationneeded = () => handleNegotiationNeededEvent(peer);

    return peer;
}

私のローカルホストでは、ホスト ( streamer.js) がメディアのストリーミングを開始すると、サーバーHost: Data Channel Openedがコンソールに出力し、ホストのブラウザーにメッセージが表示されますServer: Peer-to-peer data channel has been created.。ただし、実稼働サーバーでアプリケーションを試してみると、サーバーはそれをコンソールに記録せず、ホストのブラウザーは、データ チャネルが作成されたことを示すメッセージでトーストを開きません。

ブラウザ コンソールとサーバー コンソールの両方にエラーがないので、どこに問題があるのか​​よくわかりません。

4

1 に答える 1