2009-04-10 3 views
1

현재 자바 프로젝트를 Flex 3로 번역 중입니다. 프로젝트의 대부분은 비동기 통신을 포함합니다.FLEX를 처음 사용 - Java에서 비동기 통신 번역하기

프로그램이 스트림에 연결되어 데이터 다운로드를 시작합니다. 연결 직후 HTTP와 동일한 형식 (키 프레임)으로 컨텍스트 데이터를 다운로드해야합니다. 스트림 또는 키 프레임 동안 다양한 지점에서 추가 HTTP 호출이 필요할 수 있습니다 (예 : 암호화 키를 얻을 수 있습니다.

Java에서 HTTP를 완료하는 동안 효과적으로 키 프레임이나 스트림을 일시 중지하는 키를 얻기 위해 HTTP 요청을 수행하기 위해 차단 호출을 사용합니다. 그러면 해당 위치가 계속 이어집니다.

불행히도 Flex는 단일 스레드이며 HTTP 요청은 비동기 콜백으로 구현되므로 동일한 방식으로 코드를 구현할 수 없습니다.

Flex에 익숙하지 않아서 정상적인 습관이 무엇인지 확신 할 수 없습니다. 현재 상태를 저장하고 종료하고 HTTP 완료를 사용하여 일시 중지 된 스트림을 다시 시작할 계획입니다. 또는 타이머를 사용하는 것이 좋습니다 ...

그러나 스트림에 대해 처리중인 데이터를 수신하고 데이터 요청을 처리하는 동안 버퍼링해야합니까? 또는 진행 상황을 무시하고 Flex 및/또는 OS가 버퍼링하도록 할 수 있습니까?

이 모든 것을 더 쉽게 해주는 아키텍처에 대한 조언이있는 사람이 있습니까?

감사합니다.

편집 : 지금까지 답변 주셔서 감사합니다 ...

는 dirkgently - 나는 당신에 받고있어 이해 모르겠지만, 그것으로 살펴 보겠습니다.

brd6644 - 연결 중 하나 (스트림)는 이미 원시 소켓입니다. 질문은 일시 중지하고 다른 소스 중간 스트림에서 다른 데이터를 가져 오는 것입니다.

CookieOfFortune - 유용합니다. 감사합니다.

답변

1

플렉스는 HTTPService 클래스입니다. 귀하의 문제 설명의 외모에서, 나는 여러 가지 개체를 만들고 다양한 이벤트 처리기에 바인딩 할 것이라고 말하고 싶습니다. 특정 요청에 대해 원하는 처리 유형에 따라 다릅니다.

<mx:HTTPService url="{myURL}" id="myHTTPData" method="GET" 
       result="cacheData()" fault="downloadFault" 
       resultFormat="object"> 

<mx:HTTPService url="{myURL2}" id="mySessKey" method="GET" 
       result="saveSessKey()" fault="authFault" 
       resultFormat="object"> 

HTTPService 주위에 사용자 정의 래퍼를 만들어 대신 사용하는 것이 좋습니다. 이렇게하면 사용자 정의 이벤트 핸들러로 오브젝트를 쉽게 작성할 수 있습니다 (한 번 완료하면 해제 할 수 있습니다).

0

원시 ActionScript 소켓 API를 통해 연결하는 것은 어떻습니까? 필요에 따라 데이터를 읽고 이벤트를 전달할 수 있으며 각 이벤트는 별도의 HTTPService 호출을 트리거하여 데이터를 가져옵니다.

0

HTTPService의 send() 메서드를 사용하면 AsyncToken이 반환됩니다. AsyncToken을 사용하여 이벤트를 동기화 할 수 있습니다.

private function streamResultHandler(event:ResultEvent):void 
{ 
    ... 
    for(var str : frame) 
    { 
     if(str == "getEncryptionKey") 
     { 
      var token:AsyncToken = keyHTTPService.send(); 
      var tokenResult:Object = token.result; 
      var key = keyBuffer; 
      ... 
     } 
    } 
} 

private function keyHTTPServiceResultHandler(event:ResultEvent):void 
{ 
    keyBuffer = event.result; 
}