2012-12-24 1 views
0

저는 Flex 애플리케이션을 작성하고 있습니다.flex 앱에서 red5 원격 공유 객체에 연결

서버 측 응용 프로그램은 Red5 1.0 위에있는 Java 응용 프로그램입니다. 그 연결은 RTMPE 프로토콜로 이루어집니다. (결과는 RTMP 또는 RTMPE와 동일합니다).

서버에 제대로 연결하여 회의실에 입장하거나 퇴장 할 수는 있지만 회의실에있는 공유물에 연결할 수는 없습니다. 비 영구적 공유 객체를 사용합니다.

I는 다음과 같은 코드를 사용하여 서버 측의 객실에서 공유 객체를 생성 :

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; 

    }  

후 사용자 I가 connction 얻을 적절한 입실을 그의 단부에 함수를 호출하고 제공 클라이언트 측에서 지금

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

내가 원격 공유 객체 얻을 수있는 플렉스 응용 프로그램에서 다음 코드를 사용 :

012를 공유 객체의 이름은 그래서 그는 다음 코드를 사용하여 연결하기 위해 무엇을 알 3,516,
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에서 얻은 유일한 것은 공유 객체가 삭제된다는 것입니다. 이는 클라이언트가 초 동안 연결을 시도하고 연결이 끊어 졌음을 의미합니다.

Google에 지쳐서 피곤한 빨간색 5 Google 그룹입니다. 나는 길을 잃었다! 문제에 관한 정보는 크게 감사하겠습니다.

감사합니다.

갱신

내가 서버에 작은 클라이언트와 서버 ..

을 만들어 좋아, 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

더 이상의 로그가 필요합니까? 그러나 로그에 공유 객체가 서버에서 성공적으로 생성되었다고 표시됩니다.roomStart() 또는 공유 객체를 만들 때 어디에서든지 공유 객체를 만들 때 acquire() 메서드를 사용하십시오 (roomStart()이 올바른 위치 여야합니다). 기본적으로 서버는 클라이언트가 연결되어 있지 않으면 공유 객체를 파괴합니다.

관련 문제