flash on 2012-4-18
♥0 |
Line 128 |
Modified 2012-04-20 14:30:27 |
MIT License
archived:2017-03-30 02:55:08
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;
}
}