flash on 2012-4-18

by tepe
♥0 | Line 128 | Modified 2012-04-20 14:30:27 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/2Aq8
 */

package {
    import flash.text.*;
    import flash.display.*;
    public class FlashTest extends Sprite {
        private var net:ozNetwork = new ozNetwork();
        public function FlashTest(){
            // write as3 code here..
            var t:TextField = new TextField();
            var s:Sprite = new Sprite();
            s.graphics.beginFill(0x000000);
            s.graphics.drawRect(100,100,200,20);
            s.graphics.endFill();
            addChild(s);
            addChild(t);
            t.text = "aaa";
            t.text = net.agent.id.toString();
            t.appendText("\n"+net.agent.name);
            //var str:String = String.fromCharCode(0x0400);
            //t.appendText("\n"+str);
            
        }
    }
}
import flash.utils.ByteArray;


//--------------------------------------------------------------
/* このクラスに求める機能
・P2P通信の実現
・クライアント間の通信手段を提供すること
・クライアント間でメッセージを送受信すること

・グループ機能
・ネットワーク内でグループを構成する
・グループの作成 グループ名(任意) グループ識別ID(自動割り当て)
・グループを指定して接続
・登録グループの一覧取得
・グループの情報を共有する方法

・グループ内のクライアント一覧取得

・接続数
    グループ内のクライアント数 自分に直接つながったクライアント数
・メンバーに自身のプロファイルを提示する
    ハンドルネーム 送受信用ID 状態
*/
import flash.text.*;
import flash.events.*;
import flash.net.*;

    class ozNetwork{
        private var cnt1:int = 1;
        private var memberInfo:Object = new Object();
        private var ar:Array;
        private var logar:Array;
        private var reqflg:Boolean;
        private var so:SharedObject;
        private var soFlag:Boolean;
        
        private var gs:GroupSpecifier;//接続グループ機能制限
        private var nc:NetConnection;
        private var group:NetGroup;
        private var groupName:String;
        
        public var agent:Object = new Object();
        private var currentNetwork:String;
        
        public function ozNetwork(){
            
            so = SharedObject.getLocal("agent");
            if(so != null) soFlag = true;//セーブ可能
            else soFlag = false;//セーブ不可
            if(soFlag==true)initAgentData();
            
            // グループ機能制限
            groupName = new String();
            groupName = "net.ozworks.test1"
            gs = new GroupSpecifier(groupName);//接続グループ名
            gs.postingEnabled = true;//ポスティング許可
            gs.ipMulticastMemberUpdatesEnabled = true;//IP情報のマルチキャスト許可
            gs.multicastEnabled = false;//NetStreamによるストリーミング許可
            gs.objectReplicationEnabled = true;//オブジェクトの複製許可
            gs.routingEnabled = true;//NetGroupでの転送メソッド許可
            gs.serverChannelEnabled = true;//メンバーへサーバーチャンネルを開く権限を付与
            
            // RTMFPコネクション
            nc = new NetConnection();
            //イベント NET_STATUS
            nc.addEventListener(NetStatusEvent.NET_STATUS, procNetStatus);
            //接続
            nc.connect("rtmfp://p2p.rtmfp.net/3ea2ccfc17227d122a776d41-31e9e4d71a17/");
            //logar = new Array();
            //reqflg = false;
        }
        
        private function initAgentData():void{
            if(so.data.id == undefined)setAgentData();//初回登録
            agent.id = so.data.id;
            agent.name = so.data.name;

        }
        
        private function setAgentData():void{
            var now:Date = new Date();
            so.data.id = now.time;//クライアントの識別に使う
            so.data.name = String(Math.floor(Math.random()*100000));//仮の名前
        }
        public function addGroup(groupName:String=""):void{
            var name:String;
            if(groupName==""){
                var now:Date = new Date();
                name == now.time.toString();
            }

        }
        //データをアップロードする
        public function uploadData(path:String,data:ByteArray):String{
            if(soFlag==false)return"";
            var saveData:SharedObject = SharedObject.getLocal(path);
            if(saveData.data.createTime != undefined)return "";//すでに存在する→削除してからアップ
            var now:Date = new Date();
            saveData.data.createTime = now.time;//作成日
            saveData.data.upAgent = agent.id;//p
            saveData.data.Data = data;//データ
            
            //アップロードをグループに通知する   
            
            return "";
        }
        public function deleteData(path:String):void{
            //アップロード中のファイルを削除
        }
        private var loadData:ByteArray;//ダウンロードデータの受け皿
        public function downloadData(path:String):void{
            //データをダウンロード→自分でアップロードしたデータもこれで取り出す
        }





 
        //通信イベント
        private function procNetStatus(e:NetStatusEvent):void {
            var i:int;
            var j:int;
            var now:Date = new Date();
            //txt2.appendText("[ "+now.toLocaleDateString()+" ] ");
            //txt2.appendText(now.toLocaleTimeString()+"    ");
            //txt2.appendText(e.info.code);
            
            switch (e.info.code) {
                case "NetConnection.Connect.Success"://接続確立
                    group = new NetGroup(nc, gs.groupspecWithAuthorizations());
                    group.addEventListener(NetStatusEvent.NET_STATUS, procNetStatus);
                    break;
                    
                case "NetGroup.Connect.Success"://グループ接続確立
                    currentNetwork = groupName;
                    //開始
                    break;
                    
                case "NetGroup.Neighbor.Connect"://メンバー接続  
                     cnt1++;
                     //txt2.appendText(" "+cnt1.toString());
                     //txt2.appendText("\n");
                     memberInfo[e.info.peerID] = e.info.neighbor;
                     //txt2.appendText("obj:"+memberInfo[e.info.peerID]+"\n");
                     
                    break;
                case "NetGroup.Neighbor.Disconnect"://メンバー切断
                    cnt1--;
                    //txt2.appendText(" "+cnt1.toString());
                    //txt2.appendText("\n");
                    delete memberInfo[e.info.peerID];
                    break;
//ポスト受信------------------------
                case "NetGroup.Posting.Notify"://メンバーからのポスト受信
                    //txt2.appendText(" "+e.info.message.cmd);
                    var obj:Object = e.info.message;//メッセージオブジェクト
                    
                    group.addHaveObjects(0, 0);//同期
                    //コマンド-----------------------------------------
                    //logar.push(obj);//メッセージをログに追記
                    


                    break;
                case "NetGroup.Replication.Request"://隣接ノードからの同期要求
                    //txt2.appendText("\nrequestID:"+e.info.requestID+"\n");
                    if (e.info.index == 0) {
                        group.writeRequestedObject(e.info.requestID, {log: logar});
                    }
                    break;
                case "NetGroup.Replication.Fetch.Result"://同期要求を満たした 
                    if (e.info.index == 0) {
                        reqflg = false;
                        logar = e.info.object.log;
                        group.addHaveObjects(0, 0);
                        

                    }
                    break;
                case "NetStream.Connect.Closed"://ストリーム切断
                    break;
            }
            //txt2.appendText("\n");
            //txt2.scrollV = txt2.maxScrollV;
        }
    }