2012-12-24 82 views
0

我在写一个Flex应用程序。从flex应用程序连接到red5远程共享对象

服务器端应用程序是位于Red5 1.0之上的Java应用程序。 该连接是通过RTMPE协议进行的。 (结果与RTMP或RTMPE相同)。

我已经能够正确连接到服务器并进入和离开房间,但我无法连接到房间中的共享对象。使用非持久性共享对象。

我用下面的代码创建在服务器侧的室的共享对象:

private void createSharedObject (IScope scope, String soName, boolean persistent) { 
    ISharedObjectService service= (ISharedObjectService) ScopeUtils 
      .getScopeService(scope, 
        ISharedObjectService.class, 
        false); 
    service.createSharedObject(scope, soName, persistent); 
} 

private ISharedObject getSharedObject(IScope scope, String soName,boolean persistent) { 
    ISharedObjectService service = (ISharedObjectService) ScopeUtils 
      .getScopeService(scope, 
        ISharedObjectService.class, 
        false); 
    return service.getSharedObject(scope, soName,persistent); 
} 

    public ISharedObject getRoomSharedObject() { 
     final String soName = "room_" + this._scope.getName(); 

      log.debug("application found. creating shared object"); 
       log.debug("shared object: {} not found for scope: {}. creating one",new Object[]{soName,this._scope.getContextPath()}); 
      createSharedObject(this._scope, soName, XpoConstants.persistentSharedObjects); 
      ISharedObject so = getSharedObject(this._scope,soName, XpoConstants.persistentSharedObjects); 
      so.clear(); 

      return so; 

    }  

然后用户输入正确的房间我得到的connction,并在他端调用的函数,并且提供共享对象名称,所以他就知道要连接什么用下面的代码:

IConnection conn = Red5.getConnectionLocal(); 
    IServiceCapableConnection sc = (IServiceCapableConnection) conn; 
    sc.invoke("<function name>", new Object[]{this._so.getName(),...}); 

现在在客户端, 我用下面的代码在Flex应用程序获取远程共享对象:

var roomSharedObject:SharedObject = SharedObject.getRemote(soName, SharedUtils.getNetConnection().uri, Finals.persistentSharedObject); 

roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, this._parse); 

roomSharedObject.addEventListener(SyncEvent.SYNC,this._parse2); 
roomSharedObject.connect(SharedUtils.getNetConnection()); 

... 

    private function _parse(e:NetStatusEvent):void { 
     trace("NETSTATUSEVENT"); 
     trace("########## EVENT INFO CODE: " + e.info.code); 
    } 

    private function _parse2(e:SyncEvent):void { 
     trace("SYNCEVENT"); 

    } 

,我从RED5得到的唯一信息是:

[INFO] [pool-8-thread-12] org.red5.server.so.SharedObject - Deleting shared object room_3963 because all clients disconnected and it is no longer acquired. 

我猜NetStatusEvent应该会触发某种错误消息 ,但我根本拿不出痕迹的消息!而且我从red5得到的唯一东西是共享对象被删除,这意味着客户端试图连接一秒并断开连接。

我累到谷歌,累了red5谷歌组。我迷路了! 有关该问题的任何信息将不胜感激。

谢谢!

更新

好,我创建了一个小的客户端和服务器..

在服务器上,appConnect函数只是返回true。

客户端是一个柔性4.6客户端用下面的代码:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" creationComplete="init()" 
minHeight="600"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
    import mx.controls.Alert; 

    private var nc:NetConnection = new NetConnection(); 

    private function init():void { 

     nc.proxyType = "best"; 
     nc.objectEncoding = ObjectEncoding.AMF0; 
     nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);      
     nc.connect("rtmpe://127.0.0.1/ufktest"); 

    } 

    private function checkConnect (event:NetStatusEvent):void 
    { 
     switch (event.info['code']) { 
      case 'NetConnection.Connect.Success': 
      { 
       _red5Connected(); 
       trace('connected succesfully'); 
       break; 
      } 
      case 'NetConnection.Connect.Closed': 
      { 
       _red5Disconnected(); 
       trace('connection closed'); 
       break; 
      } 
      case 'NetConnection.Connect.Rejected': 
      { 
       _red5Disconnected(); 
       trace('connection rejected'); 
       break; 
      } 
      case 'NetConnection.Connect.Failed': 
      { 
       _red5Disconnected(); 
       trace('connection failed'); 
       break; 
      } 
      case 'NetConnection.Connect.AppShutDown': 
      { 
       trace('app shut down'); 
       _red5Disconnected(); 
       break; 
      } 
      default: 
      { 
       trace("unknown netconenction status: " + event.info['code']);     
       break; 
      }    
     } 

    } 

     private function _red5Connected():void { 
      trace("red5 connection was successful"); 
      var roomSharedObject:SharedObject = SharedObject.getRemote("moshe",nc.uri,false); 
      roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, _parse); 
      roomSharedObject.addEventListener(SyncEvent.SYNC,_parse2); 
      roomSharedObject.connect(nc); 


     } 
    private function _parse(e:NetStatusEvent):void { 
     trace("NETSTATUSEVENT"); 
     trace("########## EVENT INFO CODE: " + e.info.code); 
    } 

    private function _parse2(e:SyncEvent):void { 
     trace("SYNCEVENT"); 

    } 

     private static function _red5Disconnected():void { 
      trace("disconnected from red5"); 
      Alert.show("could not connect to server, please try again later"); 
     } 


    ]]> 
</fx:Script> 

,仍然当我运行它连接到服务器,并给我下面的错误的客户端应用程序:

[INFO] [pool-8-thread-15] org.red5.server.so.SharedObject - Deleting shared object moshe because all clients disconnected and it is no longer acquired. 

回答

0

这似乎是一个过度复杂的方式来做到这一点。如果您使用Flex方法SharedObject::getRemote所有这些都将为您照顾。如果该对象存在,客户端将获得副本。如果它不存在,则将创建该对象。因此,“房间”中的第一个人创建该对象,任何稍后出现的对象都将获得一份副本。

+0

共享对象是在创建房间时创建的。我正在用数据更新共享对象,但由于某些原因,flex应用程序的连接功能不会返回任何状态或任何错误,因此无法进行调试。除了。我想输入一些数据到共享对象。我必须先创建它。 – ufk

+0

您可以在服务器上捕获创建过程并使用您的初始数据填充它。我认为房间不存在,直到客户进入房间。 – ethrbunny

+0

是的。当发生这种情况时,我正在陷阱房间并创建一个共享对象。我认为问题不在服务器端,而是在客户端。为什么connect函数根本不返回任何状态? – ufk

1

还有其他日志吗?但是,您的日志建议在服务器上成功创建共享对象。尝试使用acquire()方法创建roomStart()内的共享对象或创建它的任何位置(尽管如此,roomStart()应该是正确的位置)。如果没有客户端连接,服务器默认会销毁任何共享对象。