2011-02-22 3 views
0

NetConnection을 통해 다른 클라이언트에 복잡한 유형의 객체 (Flex에서 RemoteClass로 표시됨)를 보내야합니다.NetConnection을 통해 복잡한 유형을 FMS로 릴레이하는 방법은 무엇입니까?

[RemoteClass] 
public class ComplexType 
{ 
    public var _someString:String; 
    public var _someInt:int; 
} 

... 그리고 사용 ...

_nc = new NetConnection(); 
_nc.connect("rtmp://localhost/echo/"); 
_nc.addEventListener(NetStatusEvent.NET_STATUS, _onNetStatus);    
_nc.client = {}; 
_nc.client.echoCallback = _echoCallback; 

var dto:ComplexType = new ComplexType(); 
dto._someInt = 4; 
dto._someString = "abrakadabra";      
_nc.call("echo", null, dto); 

는, 서버 측이 콜백 함수는 강력한 형식의 객체를 이해하지 못하는 것 같습니다이 다시 보냅니다 그러나

:

private function _echoCallback(...args):void 
{ 
    trace(ObjectUtil.toString(args)); 
    /* 

    (Array)#0 
     [0] (Object)#1 
     _someInt = 4 
     _someString = "abrakadabra" 

    */ 
} 

서버 쪽 모양 :

application.onAppStart = function() { 
    trace("Application.onAppStart > application started"); 

    Client.prototype.echo = function (complexType /*ComplexType*/) { 
     trace("Client.echo > calling echo");   
     application.broadcastMsg("echoCallback", complexType); 
    } 
} 

NetConnection을 통해 강력한 형식의 객체를 릴레이하는 방법이 있습니까?

EDIT1 : ObjectUtil.toString 첨가 콜백 함수 소스 코드의 사용을 송신하는()의 출력

+0

서버가 전송하려고하는 클래스를 "알고 있습니까?" ComplexType을 해결하려면 클래스 파일을 양쪽 끝에 포함해야합니다. – weltraumpirat

+0

FMS 4에서 사용자 정의 클래스는 어떻게 정의합니까? 나는 단지 물건을 중계하고 싶다. –

답변

1

:

var ba:ByteArray = new ByteArray(); 
ba.writeObject(dto); 

_nc.call("echo", null, ba); 

받기위한 :

그것은 woooorks
private function _echoCallback(ba:ByteArray):void 
{ 
    var dto:ComplexType = ba.readObject() as ComplexType; 

    trace(ObjectUtil.toString(dto)); 

    /* 
    (ComplexType)#0 
     _someInt = 4 
     _someString = "abrakadabra" 
    */ 
} 

!!! !

+0

이것은 예상 유형을 이미 알고있는 경우에만 작동합니다. 많은 양의 데이터가 있다면 어떨까요? – weltraumpirat

+0

@weltraumpirat 하나의 릴레이 메소드에서 모든 데이터 유형을 보낼 때 1)'_nc.call ("echo", null, "ComplexTypeAlias", ba)'및'ba.readObject() as getClassByAlias ​​(arg1) '또는 2) 객체를 다른 객체로 랩핑합니다.'class RelayMessage {public var _payload : Object; }'콘텐츠를 비 직렬화로 변환합니다. –

+0

@weltraumpirat _ 대용량의 데이터가있는 경우 _ ByteArray를 전송할 때 성능에 문제가 있습니까? –

1

당신은 당신의 [RemoteClass] 주석에 alias 속성을 추가해야합니다

[RemoteClass(alias="my.unique.Class")] 

이것은 AMF의 입력 객체에 익명 객체를 변경해야합니다.

+0

BlazeDS (또는 호환) 서버 측을 사용하지 않는 경우 클래스의 별명을 지정할 필요가 없습니다. 클라이언트 - 서버 - 클라이언트 연결별로 메시지를 중계하고 있습니다. –

관련 문제