Adobe® Flex® 4.1 リファレンスガイド
パッケージおよびクラスリストの非表示 |  パッケージ  |  クラス  |  索引  |  付録

言語リファレンスのみ       
flash.net 
NetGroup 
パッケージflash.net
クラスpublic class NetGroup
継承NetGroup Inheritance EventDispatcher Inheritance Object

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

RTMFP グループ内のメンバーシップを表す NetGroup クラスのインスタンス。このクラスを使用して、次の操作を行います。
  • サービスの質(QoS)の監視info プロパティには、NetGroupInfo オブジェクトが含まれており、このオブジェクトのプロパティによってこのグループの QoS 統計が提供されます。
  • ポスティングpost() を呼び出して、グループのすべてのメンバーに ActionScrip メッセージをブロードキャストします。
  • 転送sendToNearest()sendToNeighbor()、および sendToAllNeighbors() を呼び出して、短いデータメッセージを、ピアツーピアグループの指定したメンバーに送信します。送信元と送信先には、直接の接続は必要ありません。
  • オブジェクトレプリケーションaddHaveObjects()removeHaveObjects()addWantObjects()removeWantObjects()writeRequestedObject() および denyRequestedObject() を呼び出して、大きなデータを細かく分割し、ピアツーピアグループ のすべてのノードにレプリケートします。

クライアントサイドの NetGroup クラスでは、NetConnection によって次のイベントが送出されます。

  • NetGroup.Connect.Success
  • NetGroup.Connect.Failed
  • NetGroup.Connect.Rejected

イベントオブジェクトの info.group プロパティには、イベントソース(NetGroup)への参照が含まれます。NetGroup によって他のすべてのイベントが送出されます。サーバーサイドの NetGroup クラスでは、NetGroup によってすべてのイベントが送出されます。

ピアー対応ネットワークについて詳しくは、Adobe エバンジェリストの Tom Krcha による Basics of P2P in Flash を参照してください。ピアー対応ネットワークにおけるグループの使用について詳しくは、同じく Tom Krcha による Social Media Experiences with Flash Media and RTMFP を参照してください。

ピアー対応ネットワークの背景にある技術的な詳細については、Adobe コンピューターサイエンティストの Matthew Kaufman によるP2P on the Flash Platform with RTMFP を参照してください。

例を表示

関連項目



パブリックプロパティ
 プロパティ定義元
 Inheritedconstructor : Object
指定されたオブジェクトインスタンスのクラスオブジェクトまたはコンストラクター関数への参照です。
Object
  estimatedMemberCount : Number
[読み取り専用] ローカルネイバーフッドの密度に基づき、グループアドレスが均等に分配されることを前提にして、グループの推定メンバー数を指定します。
NetGroup
  info : NetGroupInfo
[読み取り専用] NetGroupInfo オブジェクトを返します。このオブジェクトのプロパティに、NetGroup の RTMFP ピアーツーピアーデータ転送に関するサービスの質(QoS)の統計が示されます。
NetGroup
  localCoverageFrom : String
[読み取り専用] このノードが「最も近く」にあって管理しているグループアドレスの範囲の始まりを指定します。
NetGroup
  localCoverageTo : String
[読み取り専用] このノードが「最も近く」にあって管理しているグループアドレスの範囲の終わりを指定します。
NetGroup
  neighborCount : Number
[読み取り専用] このノードが直接接続されているグループメンバーの数を指定します。
NetGroup
 Inheritedprototype : Object
[静的] クラスまたは関数オブジェクトのプロトタイプオブジェクトへの参照です。
Object
  receiveMode : String
NetGroupReceiveMode enum クラスの値の 1 つとして、ノードの配信受信モードを指定します。
NetGroup
  replicationStrategy : String
オブジェクトレプリケーションのフェッチ方法を指定します。
NetGroup
パブリックメソッド
 メソッド定義元
  
NetGroup(connection:NetConnection, groupspec:String)
指定された NetConnection オブジェクトに新しい NetGroup を構築し、それを groupspec で指定されたグループに結合します。
NetGroup
 Inherited
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
イベントリスナーオブジェクトを EventDispatcher オブジェクトに登録し、リスナーがイベントの通知を受け取るようにします。
EventDispatcher
  
addHaveObjects(startIndex:Number, endIndex:Number):void
このノードがネイバーにアドバタイズするオブジェクト(要求を満たすオブジェクト)のセットに、startIndex から endIndex の範囲に含まれるオブジェクトを追加します。
NetGroup
  
その peerID がグループのメンバーであることを指定するレコードを手動で追加します。
NetGroup
  
既にグループに存在しているはずの指定された peerID へ直ちに直接接続することによって、手動でネイバーを追加します。
NetGroup
  
addWantObjects(startIndex:Number, endIndex:Number):void
取得するオブジェクトのセットに、startIndex から endIndex の範囲にあるオブジェクトを追加します。
NetGroup
  
グループから切断し、この NetGroup を閉じます。
NetGroup
  
peerID を sendToNearest() メソッドで使用するために適切なグループアドレスに変換します。
NetGroup
  
以前に addHaveObjects() でアドバタイズされたオブジェクトの NetStatusEvent NetGroup.Replication.Request で受信した要求を拒否します。
NetGroup
 Inherited
イベントをイベントフローに送出します。
EventDispatcher
 Inherited
EventDispatcher オブジェクトに、特定のイベントタイプに対して登録されたリスナーがあるかどうかを確認します。
EventDispatcher
 Inherited
オブジェクトに指定されたプロパティが定義されているかどうかを示します。
Object
 Inherited
Object クラスのインスタンスが、パラメーターとして指定されたオブジェクトのプロトタイプチェーン内にあるかどうかを示します。
Object
  
post(message:Object):String
グループ内のすべてのメンバーにメッセージを送信します。
NetGroup
 Inherited
指定されたプロパティが存在し、列挙できるかどうかを示します。
Object
 Inherited
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
EventDispatcher オブジェクトからリスナーを削除します。
EventDispatcher
  
removeHaveObjects(startIndex:Number, endIndex:Number):void
このノードがネイバーにアドバタイズするオブジェクト(要求を満たすオブジェクト)のセットから、startIndex から endIndex の範囲に含まれるオブジェクトを削除します。
NetGroup
  
removeWantObjects(startIndex:Number, endIndex:Number):void
取得するオブジェクトのセットから、startIndex から endIndex の範囲に含まれるオブジェクトを削除します。
NetGroup
  
すべてのネイバーにメッセージを送信します。
NetGroup
  
sendToNearest(message:Object, groupAddress:String):String
指定されたグループアドレスに最も近いネイバー(ローカルノード)にメッセージを送信します。
NetGroup
  
sendToNeighbor(message:Object, sendMode:String):String
sendMode パラメーターで指定されたネイバーにメッセージを送信します。
NetGroup
 Inherited
ループ処理に対するダイナミックプロパティの可用性を設定します。
Object
 Inherited
ロケール固有の規則に従って書式設定された、このオブジェクトのストリング表現を返します。
Object
 Inherited
指定されたオブジェクトのストリング表現を返します。
Object
 Inherited
指定されたオブジェクトのプリミティブな値を返します。
Object
 Inherited
指定されたイベントタイプについて、この EventDispatcher オブジェクトまたはその祖先にイベントリスナーが登録されているかどうかを確認します。
EventDispatcher
  
writeRequestedObject(requestID:int, object:Object):void
以前に addHaveObjects() メソッドで通知したオブジェクトの NetStatusEvent NetGroup.Replication.Request で受信した要求を満たします。
NetGroup
イベント
 イベント 概要 定義元
 Inherited[ブロードキャストイベント] Flash Player または AIR アプリケーションがオペレーティングシステムのフォーカスを取得して、アクティブになったときに送出されます。EventDispatcher
 Inherited「ブロードキャストイベント」- Flash Player または AIR アプリケーションがオペレーティングシステムのフォーカスを失って、非アクティブになったときに送出されます。EventDispatcher
  NetGroup オブジェクトが、そのステータスまたはエラーの状況をレポートするときに送出されます。NetGroup
プロパティの詳細

estimatedMemberCount

プロパティ
estimatedMemberCount:Number  [読み取り専用]

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

ローカルネイバーフッドの密度に基づき、グループアドレスが均等に分配されることを前提にして、グループの推定メンバー数を指定します。



実装
    public function get estimatedMemberCount():Number

関連項目

info

プロパティ 
info:NetGroupInfo  [読み取り専用]

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

NetGroupInfo オブジェクトを返します。このオブジェクトのプロパティに、NetGroup の RTMFP ピアーツーピアーデータ転送に関するサービスの質(QoS)の統計が示されます。



実装
    public function get info():NetGroupInfo

関連項目

localCoverageFrom

プロパティ 
localCoverageFrom:String  [読み取り専用]

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

このノードが「最も近く」にあって管理しているグループアドレスの範囲の始まりを指定します。この範囲は、増分方向でグループアドレス ring mod 2256 によって指定されます。



実装
    public function get localCoverageFrom():String

関連項目

localCoverageTo

プロパティ 
localCoverageTo:String  [読み取り専用]

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

このノードが「最も近く」にあって管理しているグループアドレスの範囲の終わりを指定します。この範囲は、増分方向でグループアドレス ring mod 2256 によって指定されます。



実装
    public function get localCoverageTo():String

関連項目

neighborCount

プロパティ 
neighborCount:Number  [読み取り専用]

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

このノードが直接接続されているグループメンバーの数を指定します。



実装
    public function get neighborCount():Number

関連項目

receiveMode

プロパティ 
receiveMode:String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

NetGroupReceiveMode enum クラスの値の 1 つとして、ノードの配信受信モードを指定します。



実装
    public function get receiveMode():String
    public function set receiveMode(value:String):void

関連項目

replicationStrategy

プロパティ 
replicationStrategy:String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

オブジェクトレプリケーションのフェッチ方法を指定します。値は、NetGroupReplicationStrategy クラスに列挙された値の 1 つです。



実装
    public function get replicationStrategy():String
    public function set replicationStrategy(value:String):void

関連項目

コンストラクター詳細

NetGroup

()コンストラクター
public function NetGroup(connection:NetConnection, groupspec:String)

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

指定された NetConnection オブジェクトに新しい NetGroup を構築し、それを groupspec で指定されたグループに結合します。

ほとんどの場合、groupspec にはローカルシステムでネットワークアップリンクを使用する可能性があります。NetStream または NetGroup オブジェクトが groupspec を使用して構築されている場合、プライバシーダイアログが表示されます。このダイアログにより、この接続をユーザーのピアーとのデータ共有に使用できるかどうかが確認されます。ユーザーが「このドメインでの使用を許可する」をクリックすると、次回ユーザーがこのアプリケーションに接続するときにこのダイアログは表示されません。ピアー対応ネットワークを許可しなかった場合、グループ内のピアー機能(ポスティング、転送、オブジェクトレプリケーションおよびマルチキャスト)はすべて無効になります。許可された場合、info オブジェクトの code プロパティの NetGroup.Connect.Success によって、NetStatusEvent が NetConnection のイベントリスナーに送信されます。拒否された場合、code プロパティは NetGroup.Connect.Rejected になります。NetGroup.Connect.Success イベントが受信されるまで、NetGroup オブジェクトの任意のメソッドを呼び出そうとすると、例外が発生します。

注意:クライアントがネイティブ IP マルチキャストストリームにサブスクライブした場合、セキュリティダイアログは表示されません。

パラメーター
connection:NetConnection — NetConnection オブジェクトです。
 
groupspec:String — 結合する RTMFP ピアーツーピアーグループを指定するストリング(このメンバーの名前、機能、制限、および権限を含む)。
     new NetGroup(myConnection, myGroupSpecifier.groupspecWithAuthorizations());
     

例外
ArgumentError — NetConnection インスタンスは接続されていません。
 
Error — groupspec は無効です。

関連項目

メソッドの詳細

addHaveObjects

()メソッド
public function addHaveObjects(startIndex:Number, endIndex:Number):void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

このノードがネイバーにアドバタイズするオブジェクト(要求を満たすオブジェクト)のセットに、startIndex から endIndex の範囲に含まれるオブジェクトを追加します。デフォルトでは、Have セットは空です。インデックスは、0 ~ 9007199254740992 の整数である必要があります。

このメソッドは NetStatusEvent を info オブジェクトの code プロパティの NetGroup.Replication.Request で NetGroup のイベントリスナーに送信します。

パラメーター

startIndex:Number — Have セットに追加するオブジェクトインデックスの範囲の始まり。
 
endIndex:Number — Have セットに追加するオブジェクトインデックスの範囲の終わり。


例外
RangeError — このメソッドに渡される数は 0 より小さいか、9007199254740992 より大きくなります。

関連項目

addMemberHint

()メソッド 
public function addMemberHint(peerID:String):Boolean

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

その peerID がグループのメンバーであることを指定するレコードを手動で追加します。トポロジーに必要な場合にのみ、すぐに接続が試行されます。

パラメーター

peerID:String — 潜在的なネイバーのセットに追加する peerID。

戻り値
Boolean — 成功の場合は TRUE、エラーの場合は FALSE。

関連項目

addNeighbor

()メソッド 
public function addNeighbor(peerID:String):Boolean

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

既にグループに存在しているはずの指定された peerID へ直ちに直接接続することによって、ネイバーを手動で追加します。この直接接続は、トポロジーに必要ない場合、後で切断される場合があります。

パラメーター

peerID:String — すぐに接続する peerID。

戻り値
Boolean — 成功の場合は TRUE、エラーの場合は FALSE。

関連項目

addWantObjects

()メソッド 
public function addWantObjects(startIndex:Number, endIndex:Number):void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

取得するオブジェクトのセットに、startIndex から endIndex の範囲にあるオブジェクトを追加します。インデックスは、0 ~ 9007199254740992 の整数である必要があります。デフォルトでは、Want セットは空です。

このメソッドは、info.code プロパティでNetGroup.Replication.Fetch.SendNotify が指定されている NetStatusEvent を、NetGroup のイベントリスナーに送信します。このイベントの後には、NetGroup.Replication.Fetch.Failed または NetGroup.R plication.Fetch.Result イベントが続きます。

パラメーター

startIndex:Number — Want セットに追加するオブジェクトインデックスの範囲の始まり。
 
endIndex:Number — Want セットに追加するオブジェクトインデックスの範囲の終わり。


例外
RangeError — このメソッドに渡される数は 0 より小さいか、9007199254740992 より大きくなります。

関連項目

close

()メソッド 
public function close():void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

グループから切断し、この NetGroup を閉じます。この NetGroup はこのメソッドを呼び出した後、使用できません。

convertPeerIDToGroupAddress

()メソッド 
public function convertPeerIDToGroupAddress(peerID:String):String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

peerID を sendToNearest() メソッドで使用するために適切なグループアドレスに変換します。

パラメーター

peerID:String — 変換する peerID です。

戻り値
String — peerID のグループアドレス。

関連項目

denyRequestedObject

()メソッド 
public function denyRequestedObject(requestID:int):void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

以前に addHaveObjects() でアドバタイズされたオブジェクトの NetStatusEvent NetGroup.Replication.Request で受信した要求を拒否します。この要求が Have セットから取り下げられない限り、または取り下げられるまで、要求元によってこのオブジェクトが再び要求される可能性があります。

パラメーター

requestID:intNetGroup.Replication.Request イベントで提供される要求識別子。

関連項目

post

()メソッド 
public function post(message:Object):String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

グループ内のすべてのメンバーにメッセージを送信します。このメソッドを呼び出すには、NetGroup コンストラクターに渡される groupspec 内で、GroupSpecifier.postingEnabled プロパティが true に設定されている必要があります。

すべてのメッセージは一意である必要があり、以前にアップロードされたメッセージと同一のメッセージはアップロードされない場合があります。シーケンス番号を使用して、メッセージを一意にします。

メッセージの配信は順序付けられません。メッセージの配信は保証されません。

メッセージは AMF でシリアル化されます。メッセージの型は、Object、int、Number、String のいずれかです。メッセージは MovieClip にはできません。

このメソッドは NetStatusEvent を info.code プロパティの NetGroup.Posting.Notify で NetGroup のイベントリスナーに送信します。「NetGroup.Posting.Notify」イベントは、クライアント上とサーバー上の両方の NetGroup に送信されます。

パラメーター

message:Object — グループ内の他のすべてのメンバーに送信するメッセージ。

戻り値
String — アップロードされた場合のメッセージの messageID です。エラーの場合は null になります。messageID はメッセージを直列化した raw バイトの 16 進数の SHA256 です。

関連項目


例  ( この例の使用方法 )

これは、ピアーツアーピアーネットワークを使用するシンプルなテキストチャットアプリケーションです。アプリケーションは RTMFP 経由で Adobe Labs の Stratus サービスに接続します。Stratus は、クライアントアプリケーションのフィンガープリントを保存し、クライアントの接続時にピアーグループを管理します。ただし、すべてのデータはクライアント(ピアー)間でやり取りされ、サーバーへは戻されません。

アプリケーションの実行時に、テキスト入力フィールドに任意のグループ名を入力できます。GroupSpecifier クラスはこのグループ名(および設定済みの GroupSpecifier プロパティ)を使用して、グループの永続的な固有名となるストリングを作成します。他のクライアントをグループに接続するには、そのクライアントも同じグループ名を使用する必要があります。例えば、クライアント A が「firstmesh」というグループ名を使用する場合、クライアント A と通信したい他のクライアントも、グループ名「firstmesh」を使用する必要があります。クライアント B が「kite」というグループ名を使用している場合、接続は成功しますが、新しいグループが作成され、クライアント B はクライアント A および「firstmesh」グループに属する他のクライアントとは通信できません。

この例を実行するには、次の操作を行います。

  • Adobe Labs の Stratus にアクセスし、登録して開発者キーを取得します。
  • 次に示すコード例で、開発者キーを DEVKEY 定数値として入力します。
  • Button、Label、TextInput、TextArea の各コンポーネントを Flash Professional のライブラリに追加します。




package  {

    import flash.display.Sprite;
    import flash.events.TextEvent;
    import flash.events.MouseEvent;
    import flash.events.NetStatusEvent;
    import fl.events.ComponentEvent;
    import fl.controls.Label;
    import fl.controls.Button;
    import fl.controls.TextInput;
    import fl.controls.TextArea;
    import flash.text.TextFieldAutoSize;
    import flash.net.*;

    public class NetGroupPostExample extends Sprite{

        private var connectButton:Button;
        private var disconnectButton:Button;
        private var groupNameText:TextInput;
        private var userNameText:TextInput;
        private var chatText:TextInput;
        private var statusLog:TextArea;
        private var groupLabel:Label;
        private var userLabel:Label;

        private var netConnection:NetConnection = null;
        private var netGroup:NetGroup = null;
        private var sequenceNumber:uint = 0;
        private var connected:Boolean = false;
        private var joinedGroup:Boolean = false;

        private const SERVER:String = "rtmfp://stratus.adobe.com/";
        private const DEVKEY:String = "yourStratusDeveloperKeyGoesHere";

        public function NetGroupPostExample() {
            DoUI();
        }

        // Writes messages to the TextArea.
        private function StatusMessage(msg:Object):void{
            statusLog.text += msg;
            statusLog.verticalScrollPosition = statusLog.textHeight;
            statusLog.validateNow();
        }

        // Handles all NetStatusEvents for the NetConnection and the NetGroup.
        // This code includes cases it doesn't handle so you can see the cases
        // and their info objects for learning purposes.
        private function NetStatusHandler(e:NetStatusEvent):void{
            StatusMessage(e.info.code + "\n");
            switch(e.info.code){
                case "NetConnection.Connect.Success":
                    connectButton.enabled = false;
                    disconnectButton.enabled = true;
                    OnConnect();
                    break;

                case "NetConnection.Connect.Closed":
                    OnDisconnect();
                    break;

                case "NetGroup.Connect.Success": // e.info.group
                    OnNetGroupConnect();
                    break;

                case "NetGroup.Connect.Rejected": // e.info.group
                case "NetGroup.Connect.Failed": // e.info.group
                    break;

                case "NetGroup.Posting.Notify": // e.info.message, e.info.messageID
                    OnPosting(e.info.message);
                    break;

                case "NetStream.MulticastStream.Reset":
                case "NetStream.Buffer.Full":
                    break;

                case "NetGroup.SendTo.Notify": // e.info.message, e.info.from, e.info.fromLocal
                case "NetGroup.LocalCoverage.Notify": //
                case "NetGroup.Neighbor.Connect": // e.info.neighbor
                case "NetGroup.Neighbor.Disconnect": // e.info.neighbor
                case "NetGroup.MulticastStream.PublishNotify": // e.info.name
                case "NetGroup.MulticastStream.UnpublishNotify": // e.info.name
                case "NetGroup.Replication.Fetch.SendNotify": // e.info.index
                case "NetGroup.Replication.Fetch.Failed": // e.info.index
                case "NetGroup.Replication.Fetch.Result": // e.info.index, e.info.object
                case "NetGroup.Replication.Request": // e.info.index, e.info.requestID
                default:
                    break;
                }
            }
        // Creates a NetConnection to Stratus if the app isn't already connected
        // and if there's a group name in the TextInput field.
        private function DoConnect(e:MouseEvent):void{
            if(!connected && (groupNameText.length > 0)){
                StatusMessage("Connecting to \"" + SERVER + "\" ...\n");
                netConnection = new NetConnection();
                netConnection.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
                // To connect to Stratus, pass the server name and your developer key.
                netConnection.connect(SERVER + DEVKEY);
            }
            else
            {
                StatusMessage("Enter a group name");
            }
        }

        // Called in the "NetConnection.Connect.Success" case in the NetStatusEvent handler.
        private function OnConnect():void{

            StatusMessage("Connected\n");
            connected = true;

            // Create a GroupSpecifier object to pass to the NetGroup constructor.
            // The GroupSpecifier determines the properties of the group
            var groupSpecifier:GroupSpecifier;
            groupSpecifier = new GroupSpecifier("aslrexample/" + groupNameText.text);
            groupSpecifier.postingEnabled = true;
            groupSpecifier.serverChannelEnabled = true;

            netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());
            netGroup.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);

            StatusMessage("Join \"" + groupSpecifier.groupspecWithAuthorizations() + "\"\n");

        }

        private function OnNetGroupConnect():void{
            joinedGroup = true;
        }

        private function DoDisconnect(e:MouseEvent):void{
            if(netConnection){
                netConnection.close();
            }
        }

        private function OnDisconnect():void{
            StatusMessage("Disconnected\n");
            netConnection = null;
            netGroup = null;
            connected = false;
            joinedGroup = false;
            connectButton.enabled = true;
            disconnectButton.enabled = false;
        }

        private function ClearChatText():void{
            chatText.text = "";
        }

        // Called when you the chatText field has focus and you press Enter.
        private function DoPost(e:ComponentEvent):void{
            if(joinedGroup){
                var message:Object = new Object;
                message.user = userNameText.text;
                message.text = chatText.text;
                message.sequence = sequenceNumber++;
                message.sender = netConnection.nearID;

                netGroup.post(message);
                StatusMessage("==> " + chatText.text + "\n");
            } else {
                StatusMessage("Click Connect before sending a chat message");
            }
            ClearChatText();
        }

        private function OnPosting(message:Object):void{
            StatusMessage("<" + message.user + "> " + message.text + "\n");
        }

        private function DoUI():void {

            groupLabel = new Label();
            groupLabel.move(20, 10);
            groupLabel.autoSize = TextFieldAutoSize.LEFT
            groupLabel.text = "Group name:"
            addChild(groupLabel);

            groupNameText = new TextInput();
            groupNameText.move(90, 10);
            groupNameText.text = "channel" + (int(Math.random() * 899) + 101);
            addChild(groupNameText);

            connectButton = new Button();
            connectButton.addEventListener(MouseEvent.CLICK, DoConnect);
            connectButton.move(205, 10);
            connectButton.label = "Connect";
            addChild(connectButton);

            disconnectButton = new Button();
            disconnectButton.addEventListener(MouseEvent.CLICK, DoDisconnect);
            disconnectButton.move(310, 10);
            disconnectButton.label = "Disconnect";
            disconnectButton.enabled = false;
            addChild(disconnectButton);

            statusLog = new TextArea();
            statusLog.move(30, 38);
            statusLog.width = 360;
            statusLog.height = 215;
            statusLog.editable = false;
            addChild(statusLog);

            userLabel = new Label();
            userLabel.move(20, 270);
            userLabel.autoSize = TextFieldAutoSize.LEFT
            userLabel.text = "User name:"
            addChild(userLabel);

            userNameText = new TextInput();
            userNameText.move(80, 270);
            userNameText.text = "user " + int(Math.random() * 65536);
            addChild(userNameText);

            chatText = new TextInput();
            chatText.addEventListener(ComponentEvent.ENTER, DoPost);
            chatText.move(185, 270);
            chatText.maxChars = 255;
            chatText.width = 215;
            addChild(chatText);

        }

        public function onPlayStatus(info:Object):void {}
        public function onMetaData(info:Object):void {}
        public function onCuePoint(info:Object):void {}
        public function onTextData(info:Object):void {}

    }

}




removeHaveObjects

()メソッド 
public function removeHaveObjects(startIndex:Number, endIndex:Number):void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

このノードがネイバーにアドバタイズするオブジェクト(要求を満たすオブジェクト)のセットから、startIndex から endIndex の範囲に含まれるオブジェクトを削除します。インデックスは、0 ~ 9007199254740992 の整数である必要があります。

パラメーター

startIndex:Number — Have セットから削除するオブジェクトインデックスの範囲の始まり。
 
endIndex:Number — Have セットから削除するオブジェクトインデックスの範囲の終わり。


例外
RangeError — このメソッドに渡される数は 0 より小さいか、9007199254740992 より大きくなります。

関連項目

removeWantObjects

()メソッド 
public function removeWantObjects(startIndex:Number, endIndex:Number):void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

取得するオブジェクトのセットから、startIndex から endIndex の範囲に含まれるオブジェクトを削除します。インデックスは、0 ~ 9007199254740992 の整数である必要があります。

パラメーター

startIndex:Number — Want セットから削除するオブジェクトインデックスの範囲の始まり。
 
endIndex:Number — Want セットから削除するオブジェクトインデックスの範囲の終わり。


例外
RangeError — このメソッドに渡される数は 0 より小さいか、9007199254740992 より大きくなります。

関連項目

sendToAllNeighbors

()メソッド 
public function sendToAllNeighbors(message:Object):String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

すべてのネイバーにメッセージを送信します。1 つ以上のネイバーが選択された場合、NetGroupSendResult.SENT を返します。

ノードがメッセージを受信すると、NetStatusEvent が info オブジェクトの code プロパティの NetGroup.Posting.Notify オブジェクトで NetGroup のイベントリスナーに送信されます。

パラメーター

message:Object — 送信するメッセージです。

戻り値
String — 送信の成功またはエラーを示す列挙クラス NetGroupSendResult のプロパティ。

関連項目

sendToNearest

()メソッド 
public function sendToNearest(message:Object, groupAddress:String):String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

指定されたグループアドレスに最も近いネイバー(ローカルノード)にメッセージを送信します。リング全体のネイバーを考慮します。メッセージが宛先に正しく送信された場合、NetGroupSendResult.SENT を返します。

ノードがメッセージを受信すると、NetStatusEvent が info オブジェクトの code プロパティの NetGroup.Posting.Notify オブジェクトで NetGroup のイベントリスナーに送信されます。

パラメーター

message:Object — 送信するメッセージです。
 
groupAddress:String — メッセージの配信先のグループアドレス。

戻り値
String — 送信の成功またはエラーを示す列挙クラス NetGroupSendResult のプロパティ。

関連項目

sendToNeighbor

()メソッド 
public function sendToNeighbor(message:Object, sendMode:String):String

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

sendMode パラメーターで指定されたネイバーにメッセージを送信します。要求された宛先にメッセージが正しく送信された場合、NetGroupSendResult.SENT を返します。

ノードがメッセージを受信すると、NetStatusEvent が info オブジェクトの code プロパティの NetGroup.Posting.Notify オブジェクトで NetGroup のイベントリスナーに送信されます。

パラメーター

message:Object — 送信するメッセージです。
 
sendMode:String — メッセージの送信先のネイバーを指定する列挙クラス NetGroupSendMode のプロパティ。

戻り値
String — 送信の成功またはエラーを示す列挙クラス NetGroupSendResult のプロパティ。

関連項目

writeRequestedObject

()メソッド 
public function writeRequestedObject(requestID:int, object:Object):void

言語バージョン: ActionScript 3.0
ランタイムバージョン: Flash Player 10.1, AIR 2

以前に addHaveObjects() メソッドで通知したオブジェクトの NetStatusEvent NetGroup.Replication.Request で受信した要求を満たします。object には、Object、int、Number、String のいずれかを使用できます。object には MovieClip は指定できません。

パラメーター

requestID:intNetGroup.Replication.Request イベントで提供される要求識別子。
 
object:ObjectNetGroup.Replication.Request イベントで指定されたインデックスに対応するオブジェクト。

関連項目

イベントの詳細

netStatus

イベント
イベントオブジェクトの型: flash.events.NetStatusEvent
プロパティ NetStatusEvent.type = flash.events.NetStatusEvent.NET_STATUS

言語バージョン: ActionScript 3.0
ランタイムバージョン: AIR 1.0 Flash Player 10.1

NetGroup オブジェクトが、そのステータスまたはエラーの状況をレポートするときに送出されます。netStatus イベントには info プロパティが含まれます。info プロパティは、接続試行が成功したかどうかなど、イベントに関する情報を含むオブジェクトです。

type プロパティ(netStatus イベントオブジェクト)の値を定義します。

このイベントには、次のプロパティがあります。

プロパティ
bubblesfalse
cancelablefalse は、キャンセルするデフォルトの動作がないことを示します。
currentTargetイベントリスナーで Event オブジェクトをアクティブに処理しているオブジェクトです。
infoオブジェクトのステータスまたはエラー状態を記述するプロパティを持つオブジェクトです。
targetそのステータスを報告する NetConnection または NetStream オブジェクトです。

関連項目

NetGroupExample.as

これは、ピアーツアーピアーネットワークを使用するシンプルなビデオチャットアプリケーションです。アプリケーションは RTMFP 経由で Adobe Labs の Stratus サービスに接続します。Stratus は、クライアントアプリケーションのフィンガープリントを保存し、クライアントの接続時にピアーグループを管理します。ただし、すべてのデータはクライアント(ピアー)間でやり取りされ、サーバーへは戻されません。

アプリケーションの実行時に、テキスト入力フィールドに任意のグループ名を入力できます。GroupSpecifier クラスはこのグループ名(および設定済みの GroupSpecifier プロパティ)を使用して、グループの永続的な固有名となるストリングを作成します。他のクライアントをグループに接続するには、そのクライアントも同じグループ名を使用する必要があります。例えば、クライアント A が「firstmesh」というグループ名を使用する場合、クライアント A と通信したい他のクライアントも、グループ名「firstmesh」を使用する必要があります。クライアント B が「kite」というグループ名を使用している場合、接続は成功しますが、新しいグループが作成され、クライアント B はクライアント A および「firstmesh」グループに属する他のクライアントとは通信できません。

この例を実行するには、次の操作を行います。

  • Adobe Labs の Stratus にアクセスし、登録して開発者キーを取得します。
  • 次に示すコード例で、開発者キーを DEVKEY 定数値として入力します。



<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" applicationComplete="OnApplicationComplete()">
    <mx:Script>
        <![CDATA[
            private var netConnection:NetConnection = null;
            private var netStream:NetStream = null;
            private var netGroup:NetGroup = null;
            private var video:Video = null;
            private var sequenceNumber:uint = 0;
            private var resizeTimer:Timer = null;

            private const SERVER:String = "rtmfp://stratus.adobe.com/";
            private const DEVKEY:String = "YourStratusDeveloperKey";

            [Bindable] private var connected:Boolean = false;
            [Bindable] private var joinedGroup:Boolean = false;

            private function OnApplicationComplete():void
            {
                userName.text = "user " + int(Math.random() * 65536);

                groupName.text = "channel" + (int(Math.random() * 899) + 101);

                resizeTimer = new Timer(2000.0);
                resizeTimer.addEventListener(TimerEvent.TIMER, DoResizeVideo);
                resizeTimer.start();
            }

            private function StatusMessage(msg:Object):void
            {
                statusLog.text += msg;
                statusLog.verticalScrollPosition = statusLog.textHeight;
                statusLog.validateNow();
            }

            private function NetStatusHandler(e:NetStatusEvent):void
            {
                StatusMessage(e.info.code);
                switch(e.info.code)
                {
                case "NetConnection.Connect.Success":
                    OnConnect();
                    break;

                case "NetConnection.Connect.Closed":
                case "NetConnection.Connect.Failed":
                case "NetConnection.Connect.Rejected":
                case "NetConnection.Connect.AppShutdown":
                case "NetConnection.Connect.InvalidApp":
                    OnDisconnect();
                    break;

                case "NetStream.Connect.Success": // e.info.stream
                    OnNetStreamConnect();
                    break;

                case "NetStream.Connect.Rejected": // e.info.stream
                case "NetStream.Connect.Failed": // e.info.stream
                    DoDisconnect();
                    break;

                case "NetGroup.Connect.Success": // e.info.group
                    OnNetGroupConnect();
                    break;

                case "NetGroup.Connect.Rejected": // e.info.group
                case "NetGroup.Connect.Failed": // e.info.group
                    DoDisconnect();
                    break;

                case "NetGroup.Posting.Notify": // e.info.message, e.info.messageID
                    OnPosting(e.info.message);
                    break;


                case "NetStream.MulticastStream.Reset":
                case "NetStream.Buffer.Full":
                    DoResizeVideo();
                    break;

                case "NetGroup.SendTo.Notify": // e.info.message, e.info.from, e.info.fromLocal
                case "NetGroup.LocalCoverage.Notify": //
                case "NetGroup.Neighbor.Connect": // e.info.neighbor
                case "NetGroup.Neighbor.Disconnect": // e.info.neighbor
                case "NetGroup.MulticastStream.PublishNotify": // e.info.name
                case "NetGroup.MulticastStream.UnpublishNotify": // e.info.name
                case "NetGroup.Replication.Fetch.SendNotify": // e.info.index
                case "NetGroup.Replication.Fetch.Failed": // e.info.index
                case "NetGroup.Replication.Fetch.Result": // e.info.index, e.info.object
                case "NetGroup.Replication.Request": // e.info.index, e.info.requestID
                default:
                    break;
                }
            }

            private function DoConnect():void
            {
                StatusMessage("Connecting to \"" + SERVER + "\" ...\n");
                netConnection = new NetConnection();
                netConnection.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
                netConnection.connect(SERVER + DEVKEY);
            }

            private function OnConnect():void
            {
                var groupSpecifier:GroupSpecifier;

                StatusMessage("Connected\n");
                connected = true;

                groupSpecifier = new GroupSpecifier("max2009lab/" + groupName.text);
                groupSpecifier.multicastEnabled = true;
                groupSpecifier.postingEnabled = true;
                groupSpecifier.serverChannelEnabled = true;

                netStream = new NetStream(netConnection, groupSpecifier.groupspecWithAuthorizations());
                netStream.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);

                netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());
                netGroup.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);

                StatusMessage("Join \"" + groupSpecifier.groupspecWithAuthorizations() + "\"\n");
            }

            private function OnNetStreamConnect():void
            {
                netStream.client = this;

                var mic:Microphone = Microphone.getMicrophone();
                if(mic)
                {
                    mic.codec = SoundCodec.SPEEX;
                    mic.setSilenceLevel(0);

                    netStream.attachAudio(mic);

                    StatusMessage("got microphone\n");
                }

                var camera:Camera = Camera.getCamera();
                if(camera)
                {
                    camera.setMode(320, 240, 10);
                    camera.setQuality(30000, 0);
                    camera.setKeyFrameInterval(15);

                    videoDisplay.attachCamera(camera);
                    videoDisplay.maintainAspectRatio = true;

                    netStream.attachCamera(camera);

                    StatusMessage("got camera\n");
                }

                netStream.publish("stream");
            }

            private function OnNetGroupConnect():void
            {
                joinedGroup = true;
            }

            private function DoDisconnect():void
            {
                if(netConnection)
                    netConnection.close();
                videoDisplay.attachCamera(null);
            }

            private function OnDisconnect():void
            {
                StatusMessage("Disconnected\n");
                netConnection = null;
                netStream = null;
                netGroup = null;
                connected = false;
                joinedGroup = false;
            }

            private function ClearChatText():void
            {
                chatText.text = "";
            }

            private function DoPost():void
            {
                var message:Object = new Object;

                message.user = userName.text;
                message.text = chatText.text;
                message.sequence = sequenceNumber++;
                message.sender = netConnection.nearID;

                netGroup.post(message);

                StatusMessage("==> " + chatText.text + "\n");

                chatText.callLater(ClearChatText);
            }

            private function OnPosting(message:Object):void
            {
                StatusMessage("<" + message.user + "> " + message.text + "\n");
            }

            private function DoResizeVideo(ignored:* = null):void
            {
                if(video)
                {
                    if( (0 == video.videoHeight)
                     || (0 == video.videoWidth)
                    )
                    {
                        video.height = videoDisplay.height;
                        video.width = videoDisplay.width;
                        video.x = 0;
                        video.y = 0;
                    }
                    else
                    {
                        var videoAspect:Number = Number(video.videoWidth) / Number(video.videoHeight);
                        var displayAspect:Number = Number(videoDisplay.width) / Number(videoDisplay.height);
                        var adjustFactor:Number;

                        if(videoAspect >= displayAspect) // video is wider than display
                        {
                            adjustFactor = Number(video.videoWidth) / Number(videoDisplay.width);
                            video.width = videoDisplay.width;
                            video.height = int(Number(video.videoHeight) / adjustFactor);
                            video.x = 0;
                            video.y = int((videoDisplay.height - video.height) / 2);
                        }
                        else
                        {
                            adjustFactor = Number(video.videoHeight) / Number(videoDisplay.height);
                            video.height = videoDisplay.height;
                            video.width = int(Number(video.videoWidth) / adjustFactor);
                            video.x = int((videoDisplay.width - video.width) / 2);
                            video.y = 0;
                        }
                    }
                }
            }

            public function onPlayStatus(info:Object):void {}
            public function onMetaData(info:Object):void {}
            public function onCuePoint(info:Object):void {}
            public function onTextData(info:Object):void {}

            public function ValidateConnectAllowed(isConnected:Boolean, groupNameText:String):Boolean
            {
                return (!isConnected) && (groupNameText.length > 0);
            }
        ]]>
    </mx:Script>

    <mx:VBox top="10" right="10" left="10" bottom="10" verticalGap="6">
        <mx:HBox width="100%">
            <mx:Text text="Group:"/>
            <mx:TextInput id="groupName" width="100%" text="default" enabled="{!connected}"/>
            <mx:Button label="Connect" click="DoConnect()" enabled="{ValidateConnectAllowed(connected, groupName.text)}" />
            <mx:Button label="Disconnect" click="DoDisconnect()" enabled="{connected}" />
        </mx:HBox>
        <mx:VideoDisplay id="videoDisplay" width="320" height="240" resize="DoResizeVideo()"/>
        <mx:TextArea id="statusLog" width="100%" height="100%"/>
        <mx:HBox width="100%">
            <mx:TextInput id="userName" width="160" />
            <mx:TextInput id="chatText" width="100%" enabled="{joinedGroup}" enter="DoPost()"/>
        </mx:HBox>
    </mx:VBox>

</mx:Application>