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 초가 경과하기 전에이 프로세스가 완전히 성공하는 유일한 방법입니다.
이전에는 HTTP Streaming API에 URLStream을 사용 했으므로 객체의 제한이 아닙니다. 이 SO 응답 (http://stackoverflow.com/questions/7213549/long-polling-http-streaming-general-questions#answer-7347851)은 증명할 샘플 앱을 만드는 데 사용할 수있는 매우 간단한 PHP 스트리밍 예제를 제공합니다 Air 앱이 작동하고 실제 서비스에 연결을 시도합니다. – leggetter
@leggetter에게 감사드립니다. 저는 PHP 예제를 사용하여 내 이슈의 제거 된 버전을 만들고 위에 업데이트했습니다. 여기에 경험이 있으신가요? – evanflash
'idleTimeout'을 설정하여이 문제를 해결 한 것을 기쁘게 생각합니다. – leggetter