2011-09-26 3 views
1

AIR 응용 프로그램을 사용하여 기존 Comet 스타일의 긴 폴링 서비스에 연결하려고합니다. 이 서비스는 클라이언트가 Connection : Keep-Alive 헤더로 GET 요청을 할 것으로 기대합니다. 이 요청은 서버가 데이터를 통과 할 수 있도록 오랜 기간 동안 열린 상태로 유지됩니다. 내 앱에서 30 초 후에 IOError로 연결이 종료됩니다.URLStream을 사용하는 AIR에서 혜성 스타일의 Long-Poll

URLStream의 문서화되지 않은 제한 사항입니까? adl에 대한 제한 사항 (필자는 adl을 통해 내 앱만 실행했습니다)?

서버는 클라이언트에 "연결 유지"메시지를 보내지 않지만, 불행히도 내가 제어 할 수있는 것이 아닙니다.

업데이트는

이를 테스트하기 위해, 나는 약간의 PHP 스크립트를 사용하여 제거 다운 버전을 설정 한 (아래 leggetter로 연결) 및 간단한 AIR 응용 프로그램에서 타격하고있다. URLStream 또는 URLLoader를 사용하는지 여부에 관계없이 연결이 30 초 후에 닫힙니다. 는 PHP :

<?php 
set_time_limit(0); 

sleep(40); 
echo("START!"); 

header('Content-type: text/plain'); 
echo str_pad('PADDING', 2048, '|PADDING'); 

$sleep_time = 1; 
$count = 0; 
while($count < 20) { 
    echo($count); 
    flush(); 
    $count = $count + 1; 
    sleep($sleep_time); 
} 
echo("end"); 
?> 

그리고 액션 스크립트 : 나는 30 초 동안 아무것도에 PHP 스크립트의 초기 수면 시간을 조절하면

private function beginSubscribeToNotifications():void { 
    var req:URLRequest = new URLRequest(myPHPFile); 
    req.method = URLRequestMethod.GET; 
    req.requestHeaders.push(new URLRequestHeader("Connection", "Keep-Alive")); 

    _urlLoader = new URLLoader(); 
    _urlLoader.addEventListener(Event.COMPLETE, onComplete); 
    _urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
    _urlLoader.load(req); 
} 

private function onComplete(e:Event):void { 
    _message = (String)(_urlLoader.data); 
} 

가의 IO 오류 이벤트가 트리거됩니다. 절전 시간을 낮추지 만 요청에서 30 초가 지난 데이터를 계속 추가하면 onComplete 이벤트가 호출되지만 _urlLoader.data는 비어 있습니다.

전체 프로세스가 30 초가 경과하기 전에이 프로세스가 완전히 성공하는 유일한 방법입니다.

+1

이전에는 HTTP Streaming API에 URLStream을 사용 했으므로 객체의 제한이 아닙니다. 이 SO 응답 (http://stackoverflow.com/questions/7213549/long-polling-http-streaming-general-questions#answer-7347851)은 증명할 샘플 앱을 만드는 데 사용할 수있는 매우 간단한 PHP 스트리밍 예제를 제공합니다 Air 앱이 작동하고 실제 서비스에 연결을 시도합니다. – leggetter

+0

@leggetter에게 감사드립니다. 저는 PHP 예제를 사용하여 내 이슈의 제거 된 버전을 만들고 위에 업데이트했습니다. 여기에 경험이 있으신가요? – evanflash

+0

'idleTimeout'을 설정하여이 문제를 해결 한 것을 기쁘게 생각합니다. – leggetter

답변

1

글쎄, 이건 다소 당황 스럽지만, 누군가 다른 사람이이 문제를 신고 할 경우에 대비해 게시 할 것이라고 생각했습니다. URLRequestDefaults.idleTimeout 값을 설정하여 문제점을 해결했습니다.

설명서에 따르면 : 이 속성을 0 (기본값)으로 설정하면 런타임은 운영 체제에서 정의한 기본 유휴 시간 제한 값을 사용합니다. 기본 유휴 시간 초과 값은 운영 체제 (예 : Mac OS, Linux 또는 Windows)와 운영 체제 버전에 따라 다릅니다.

Windows 7의 경우 30 초였습니다.