2014年3月1日土曜日

P2P探訪 StunでNat越え その7 WebRTCでShakehand

前回、Stunの実例として、WebRTCを利用してSDP(自身のアドレスとポート)を取得しました。せっかくなので、WebRTCを使って、Peer同士でメッセージのやり取してみましょう。


WebRTCを用いて、お互いのPeerが接続してメッセージを送る方法は簡単です。
1. 自分のSDPと相手のSDPを取得する。
2. 取得したSDPを設定する。
3. メッセージを送信する。※今回はテキスト

とするだけです。

[解説]

以前説明した通り、Peerどうしが接続するためには、接続相手のアドレスを知る必要があります。このアドレスを知りたい場合には、Stunサーバーを利用するのでした。

また、接続される側も、接続してくるPeerのアドレスがわかっていれば、「UDPパンチ」などを用いて、接続できる可能性をあげる事ができるのは、ご存知のことでしょう。以前解説したとおりです。

WebRTCも同様の手法を取っています。「接続される側」、「接続する側」のアドレスを前もって、WebRTCの知らせる事で、Peer同士が接続できるようになります。

※注意点
WebRTCでは、「接続される側」、「接続する側」のアドレスを、Peerに知らせる方法は提供されていません。
独自に実装する必要があります。WebSocketを利用する方法流行っているみたいです!!



[接続の処理の流れ]

実際の処理の流れを見てみましょう。接続が完了すれば、メッセージを送信できるようになります。

○自分のSDPを取得/設定
#接続を要求する側
O-1. RTCPeerConnectionを生成する。
O-2. RTCPeerConnection#createOffer()をコールする。
O-3. RTCPeerConnection#setLocalDescription()をコールして設定する

#接続を受け入れる側
A-1. RTCPeerConnectionを生成する
A-2. RTCPeerConnection#createAnswer()をコールする
A-3. RTCPeerConnection#setLocalDescription()をコールして設定する
※A-2の操作は先に接続要求してきている、SDPを設定しておく必要があります

○相手のSDPを設定する

#接続を要求する側/#接続を受け入れる側
A/O-1. RTCPeerConnection#setRemoteDescription()をコールする。

[サンプルコード]

○サンプルコード

WebRTCを利用して、テキストを送る事ができます。
※通常は、SDPデータを交換するのに、WebSocketを使います。しかし、今回のサンプルでは、WebSocket用のサーバーを用意する必要はありません。その部分は手動で行うように作りました。


[次回]

....次回は、WebRTCを使って、何かします。たぶん、Torrentの考え方を応用したサンプルを紹介します。




2 件のコメント:

  1. [追記]
    記載し忘れていませんてしたが、接続を開始する方向も重要です。

    例えば、Natには、
    * 制限Natからフルコーンへの接続は可能です。
    * フルコーンから制限Natへの接続は不可能です。
    といった制限があります。

    両方ともフルコーンの場合はどちらから接続してもよいのです。しかし、どたらかが、制限Natの場合は、制限Natからフルコーンへ接続してあげないと、上手くShakehandできないのです。


    WebRTCでは、この辺りはフレームワークが適当に処理してくれているのでしょう。多分..。

    返信削除
  2. かなりハショっている。実際に組むときには、シェークハンドは、以下のサンプルに従う事。
    http://dev.w3.org/2011/webrtc/editor/webrtc.html#examples-and-call-flows

    返信削除

mbedtls dart の 開発を始めた web wasm ffi io flutter

C言語 で開発した機能を、Dart をターゲットとして、Web でも サーバーでも、そして Flutter  でも使えるようにしたい。 そこで、mbedtls の 暗号化の部分を Dart 向けのPackageを作りながら、 実現方法を試行錯誤する事にした。 dart...