如何在AS3和Red5中使用远程SharedObject

时间:2014-04-07 03:51:29

标签: actionscript-3 flash actionscript red5 shared-objects

我希望使用远程SharedObject,因此我创建了一个简单的脚本来测试这些技术。当我将以下代码作为两个SWF实例运行时,两个实例都输出1,这是不正确的,因为第二个实例应该输出2。

import flash.net.SharedObject;
import flash.events.SyncEvent;

var nc:NetConnection; 
var so:SharedObject;

nc = new NetConnection(); 
nc.client = { onBWDone: function():void{} };
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
nc.connect("rtmp://localhost:1935/live");

var t = new TextField();
addChild(t);

function onNetStatus(event:NetStatusEvent):void{ 
   if(event.info.code == "NetConnection.Connect.Success"){ 
      so = SharedObject.getRemote("shObj",nc.uri);
      so.connect(nc);
      if (!(so.data.total > 0 && so.data.total<1000)) {// undefined
          so.data.total=1;
      } else so.data.total=2;
      t.text=so.data.total;
   } 
}

我错过了什么吗?我是否需要对Flash或Red5进行一些特殊设置?我需要创建一个特殊目录吗?我必须使用特殊事件监听器吗?任何人都可以为我更正代码吗?


(2014年4月9日)

当我使用如下所示的事件监听器时,我得到了两个实例的空白屏幕,这很奇怪,因为我预计至少第二个屏幕会显示&#39; 2&#39;。有人可以解释一下这种行为吗?

import flash.net.SharedObject;
import flash.events.SyncEvent;

var nc:NetConnection; 
var so:SharedObject;

nc = new NetConnection(); 
nc.client = { onBWDone: function():void{} };
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
nc.connect("rtmp://localhost:1935/live");

var t = new TextField();
addChild(t);

function onNetStatus(event:NetStatusEvent):void{ 
   if(event.info.code == "NetConnection.Connect.Success"){ 
      so = SharedObject.getRemote("shObj",nc.uri);
      so.addEventListener(SyncEvent.SYNC,syncHandler);
      so.connect(nc);
      so.setProperty("total",2);
   } 
}

function syncHandler(event:SyncEvent):void{
   if (so.data.total) {
      t.text = so.data.total;
   }   
}

1 个答案:

答案 0 :(得分:2)

基本上,对于共享对象的使用,我建议将作业分成三个单独的部分。

  1. 附加事件侦听器并连接到共享对象

    function onNetStatus(event:NetStatusEvent):void
    { 
       if(event.info.code == "NetConnection.Connect.Success")
       { 
          so = SharedObject.getRemote("shObj",nc.uri);
          so.addEventListener(SyncEvent.SYNC,syncHandler); //add event listener for  Shared Object
          so.connect(nc);
       } 
    }
    
  2. 完成事件处理程序方法以反映共享对象值

    的更改
    /*    This function is called whenever there is change in Shared Object data   */
    function syncHandler(event:SyncEvent):void
    {
        if(so.data.total) //if total field exists in the Shared Object
           trace(so.data.total);
    }
    
  3. 更改共享对象中的数据:
    在此处使用共享对象的setProperty方法。当您需要更改值时(可能是按钮单击或发生某个事件时)调用此方法

    /*    This function writes values to the Shared Object    */
    function changeValue(newValue:String)
    {
       so.setProperty("total",newValue);
    }