11. 独自データの送受信
前項までに、リモート映像の表示、リモート音声の再生ができるようになりました。
Web RTCを利用すると、映像ストリームデータ、音声ストリームデータの送受信にとどまらず、独自データの送受信を行うことができます。
Web RTCを利用して独自データを送受信を行うには、DataChannelを作成します。
本項では、カスタムデータの送受信として、テキストデータの送受信を行います。
解説
カスタムデータの送受信ですべきことは、以下です。
- Offerする側は、OfferSDPを作成する前に、DataChannnelオブジェクトを作成します。作成したDataChannelオブジェクトを保持します。
- Offerされる側は、相手との接続が完了すると、Data channel イベントが発生します。Data channel イベント時には、DataChannelオブジェクトを手にいれることができるので、手に入れたDataChannelオブジェクトを保持します。
- 作成もしくは手に入れたDataChannelオブジェクトについて、DataChannelに関するイベントハンドラを構築します。
- 独自データの送信は、DataChannelオブジェクトのsend()関数で行います。
- 独自データの受信は、DataChannelオブジェクトの「message イベントが発生したときのイベントハンドラ」で行います。
準備
「10. Trickle ICE 方式によるシグナリング」を実施していない場合は、実施します。
サーバー側の処理
変更なし。
ウェブページ
「public/index.html」ファイルを編集します。
「body」部の「リモート映像表示用の要素とリモート音声再生用の要素」の下に、以下に関するコードを追加します。
- 送信するテキストメッセージを入力するためのテキストボックス
- 入力したテキストメッセージを送信するときに押すボタン
- 受信したテキストメッセージと送信したテキストメッセージを表示するためのテキストエリア
クライアント側の処理
「public/client.js」ファイルを編集します。
グローバル変数
「グローバル変数」コード部に、以下のグローバル変数の定義を追加します。
- 送信するテキストメッセージを入力するためのテキストボックス
- 受信したテキストメッセージと送信したテキストメッセージを表示するためのテキストエリア
「Send OfferSDP.」ボタンを押すと呼ばれる関数
Offerする側は、OfferSDPを作成する前に、DataChannnelオブジェクトを作成します。作成したDataChannelオブジェクトを保持します。
「UIから呼ばれる関数」コード部の「Send OfferSDP.」ボタンを押すと呼ばれる関数について、DataChannelの作成に関する処理を追加します。
- DataChannelオブジェクトを作成します。
- DataChannelオブジェクトを、RTCPeerConnectionオブジェクトのメンバーに追加します。
- DataChannelオブジェクトのイベントハンドラを構築します。
Data channel イベントが発生したときのイベントハンドラ
Offerされる側は、相手との接続が完了すると、DataChannelイベントが発生します。Data channel イベント時には、DataChannelオブジェクトを手にいれることができるので、手に入れたDataChannelオブジェクトを保持します。
「RTCPeerConnection関連の関数」コード部の「RTCPeerConnectionオブジェクトのイベントハンドラの構築」関数に、「Data
channel イベントが発生したときのイベントハンドラ」を追加します。
- DataChannelオブジェクトが手に入ります。
- DataChannelオブジェクトを、RTCPeerConnectionオブジェクトのメンバーに追加します。
- DataChannelオブジェクトのイベントハンドラを構築します。
DataChannelオブジェクトのイベントハンドラの構築関数
作成もしくは手に入れたDataChannelオブジェクトについて、DataChannelに関するイベントハンドラを構築します。
「DataChannel関連の関数」コード部に、「DataChannelオブジェクトのイベントハンドラの構築」関数の定義を追加します。
- 「message イベントが発生したときのイベントハンドラ」の処理として、データタイプが"message" のデータを受信したときは、受信メッセージをメッセージテキストエリアへ追加します。
「Send OfferSDP.」ボタンを押すと呼ばれる関数
「UIから呼ばれる関数」コード部に、「Send OfferSDP.」ボタンを押すと呼ばれる関数」の定義を追加します。
- メッセージをDataChannelを通して相手に直接送信します。
- 送信メッセージをメッセージテキストエリアへ追加します。
コネクションの終了処理関数
「RTCPeerConnection関連の関数」コード部の「コネクションの終了処理」関数の処理を変更します。
- 「DataChannelの終了」の処理を追加します。
DataChannelが開いているか関数
「DataChannel関連の関数」コード部に、「DataChannelが開いているかを返却する」関数の定義を追加します。
- RTCPeerConnectionオブジェクトのdatachannelの「readyState」が「open」なら「DataChannelは開いている(true)」を返します。それ以外は、「DataChannelは開いていない(false)」を返します。
動作確認
node でサーバーを起動します。
ブラウザを2つ立ち上げ、それぞれのブラウザで「localhost:1337」にアクセスします。
片方のブラウザで「Send OfferSDP」ボタンを押すと、ビデオチャットが開始します。
テキストメッセージを送受信することができます。
ダウンロード
デモ
デモ(Google App Engine) : https://my-video-chat.appspot.com/app11/index.html
デモ(Heroku) : https://myvideochat1234.herokuapp.com/app11/index.html
関連ページ
前項目 : 10. Trickle ICE 方式によるシグナリング
次項目 : 12. カメラ(マイク)の停止と再開