RTMFP野郎の会行ってきた

イデア次第では化ける可能性があると思ったので簡単にまとめる。
トゥギャッターまとめRTMFP Lab に大幅に遅刻したボクが RTMFP Lab 関連のツイートをまとめてみた。 - Togetter

RTMFPとは?

ウィキペディアReal Time Media Flow Protocol - Wikipedia
簡単に言うとUDPベースのプロトコルの一種。メディアをやりとりするのに向いていて、P2Pでのやりとりが可能。


使い方

  1. NetConnectionを作成・接続する
  2. NetGroupの仕様を設定する(GroupSpecifier)
  3. NetGroupを作成・接続する
  4. メッセージ/ストリームのやりとりを行う

具体的なコードはこちら

// 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

TIPSとか