RTMFP野郎の会行ってきた
アイデア次第では化ける可能性があると思ったので簡単にまとめる。
トゥギャッターまとめRTMFP Lab に大幅に遅刻したボクが RTMFP Lab 関連のツイートをまとめてみた。 - Togetter
RTMFPとは?
ウィキペディアReal Time Media Flow Protocol - Wikipedia
簡単に言うとUDPベースのプロトコルの一種。メディアをやりとりするのに向いていて、P2Pでのやりとりが可能。
使い方
- NetConnectionを作成・接続する
- NetGroupの仕様を設定する(GroupSpecifier)
- NetGroupを作成・接続する
- メッセージ/ストリームのやりとりを行う
具体的なコードはこちら
// NetConnection の作成・接続 var nc:NetConnection = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); nc.connect("rtmfp:"); // NetConnection のステータスハンドラ function onNetStatus(e:NetStatusEvent):void { // 接続成功したらNetGroupを作成する if (e.info.code == "NetConnection.Connect.Success") { setupGroup(); } } // NetGroup var ng:NetGroup; function setupGroup():void { // NetGroup の仕様を設定 var gs:GroupSpecifier = new GroupSpecifier("myGroup/g1"); gs.ipMulticastMemberUpdatesEnabled = true; gs.multicastEnabled = true; gs.objectReplicationEnabled = true; gs.peerToPeerDisabled = false; gs.postingEnabled = true; gs.routingEnabled = true; gs.serverChannelEnabled = true; gs.addIPMulticastAddress("224.0.0.254:30000"); // NetGroup を作成/接続 ng = new NetGroup(nc, gs.groupspecWithAuthorizations()); ng.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus2); } // NetGroup のステータスハンドラ function onNetStatus2(e:NetStatusEvent):void { switch (e.info.code) { case "NetGroup.Connect.Success": trace("connected"); break; case "NetGroup.Posting.Notify": receiveMessage(e.info.message); break; } } // メッセージ/ストリームのやりとり // 受信 function receiveMessage(message:Object):void { trace(message.text); } // 送信 function sendMessage():void { var message:Object = new Object(); message.sender = ng.convertPeerIDToGroupAddress(nc.nearID); message.text = "hogehoge"; // 任意のメッセージを記述 // post 以外にもsendToNeighborやsendToAllNeighborsなどの方法がある ng.post(message); message.text = "post - " + message.text; receiveMessage(message); }
実際動くコードとしては@mousepancyoさんや@SIHO_oさんのものを参考にしたほうがいいかも
@mousepancyoさん http://wonderfl.net/c/vXBY
@SIHO_oさん http://wonderfl.net/c/edvz
解説
サーバーについて
従来RTMP系のプロトコルを利用するにはFCS(FlashCommunicationServer)またはFMS(FlashMediaServer)が必要だった(これはまた次バージョンで名前がAMS (AdobeMediaServer) に変わるらしい)。しかし、RTMFP は同一ネットワーク上で待ち受けるノードに直接アクセスができる。その場合は NetConnection の connect の際にURLを "rtmfp:" と指定する。
NetGroupの仕様について
リファレンスGroupSpecifier - Adobe ActionScript® 3(AS3 )API リファレンス
このGroupSpecifierっていうクラスの値を変更することで設定する。
- ipMulticastMemberUpdatesEnabled
- multicastEnabled
- objectReplicationEnabled
- peerToPeerDisabled
- postingEnabled
- routingEnabled
- serverChannelEnabled
この7つのプロパティと
- addIPMulticastAddress(address:String, port:* = null, source:String = null)
このメソッドあたりは基本的に設定したほうが良い。
マルチキャストIPの範囲については http://www.infraexpert.com/study/multicast2.htm この辺を参考にすると良い。ローカルネットワーク上で接続した場合は 224.0.0.0 〜 224.0.0.255 の範囲を設定する。
メッセージの送受信について
多数のノードが接続するような環境では、メッセージング方法によって速度に影響が出る。
例えば上のソースコードではpostを使っているが、postはグループ内のすべてのピアにメッセージを送るのですごく遅い。
sendToAllNeighbors(message:Object)を利用したほうがネットワーク負荷的にも良いらしい。
sendToAllNeighbors を使うにはピア同士が円状に繋がっているのを意識して書く。このあたりの記事が参考になる。Flash Real-Time - Ihr Immobilien-Ratgeber