2010-08-03 4 views
3

flash.net.Socket을 사용하여 서버에 연결하는 플래시 무비가 있습니다. 그러나 서버가 실행되고 있지 않아 포트 소켓에서 수신 대기하는 것이 아무것도 연결되어 있지 않은 상황이 발생할 수 있습니다.flash.net.Socket을 사용하여 TCP 연결이 거부되었음을 감지하는 방법이 있습니까?

"telnet hostname port"를 수행 할 때 빠른 연결이 거부되었습니다. 그러나 flash.net.Socket은 이벤트를 호출하지 않지만 (아래 참조) 자동으로 소켓 시간 초과를 기다립니다. 저에게있어 클러스터에있는 다른 서버에 다시 연결할 수 있으려면 존재하지 않는 서버를 감지하는 데 필요한 시간을 최대한 줄이는 것이 중요합니다.

나는 다음과 같은 이벤트를 시도했지만, 아무 소용 닫기

    • IO 오류
    • 에서 SecurityError
    • socketData는

    이 중에없는 연결 그러한 상황에서 발동된다.

    flash.net.Socket을 사용하여 TCP 연결이 거부되었음을 감지하는 방법이 있습니까?

  • 답변

    0

    <img src='http://target:port/' onerror='noconnect' />을 추가하면 연결 오류가 catch됩니다.

    +0

    모든 브라우저에서 오류가 지원됩니까? 서버가 아무것도 반환하지 않을 때 해고됩니까? – gleber

    +0

    예, 서버가 GET /에 대한 빈 응답으로 응답 할 수있는 것이 가장 좋습니다. - 그런 다음 onsuccess가 호출되었습니다. http://www.w3schools.com/jsref/event_img_onerror.asp - 모든 브라우저에서 지원되는 오류가있는 것 같습니다. 적어도 오페라/iceweasel/ie 그것은 나를 위해 작동합니다. – datacompboy

    +0

    제안 해 주셔서 감사합니다.하지만이 방법은 해결 방법 일뿐입니다. 나는 조금 더 기다릴 것이다. 어쩌면 실제 해결책이 존재할 수도 있습니다. – gleber

    0

    무슨 일이에 대해 :

    package { 
        import flash.display.Sprite; 
    
        public class SocketExample extends Sprite { 
    
         public function SocketExample() { 
          var socket:CustomSocket = new CustomSocket("localhost", 80); 
         } 
        } 
    } 
    
    import flash.errors.*; 
    import flash.events.*; 
    import flash.net.Socket; 
    
    class CustomSocket extends Socket { 
        private var response:String; 
    
        public function CustomSocket(host:String = null, port:uint = 0) { 
         super(host, port); 
         this.timeout=100; 
         configureListeners(); 
        } 
    
        private function configureListeners():void { 
         addEventListener(Event.CLOSE, closeHandler); 
         addEventListener(Event.CONNECT, connectHandler); 
         addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
         addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
         addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
        } 
    
        private function writeln(str:String):void { 
         str += "\n"; 
         try { 
          writeUTFBytes(str); 
         } 
         catch(e:IOError) { 
          trace(e); 
         } 
        } 
    
        private function sendRequest():void { 
         trace("sendRequest"); 
         response = ""; 
         writeln("GET /"); 
         flush(); 
        } 
    
        private function readResponse():void { 
         var str:String = readUTFBytes(bytesAvailable); 
         response += str; 
        } 
    
        private function closeHandler(event:Event):void { 
         trace("closeHandler: " + event); 
         trace(response.toString()); 
        } 
    
        private function connectHandler(event:Event):void { 
         trace("connectHandler: " + event); 
         sendRequest(); 
        } 
    
        private function ioErrorHandler(event:IOErrorEvent):void { 
         trace("ioErrorHandler: " + event); 
        } 
    
        private function securityErrorHandler(event:SecurityErrorEvent):void { 
         trace("securityErrorHandler: " + event); 
        } 
    
        private function socketDataHandler(event:ProgressEvent):void { 
         trace("socketDataHandler: " + event); 
         readResponse(); 
        } 
    } 
    
    +0

    짧은 시간 제한을 기반으로하지 않습니까? 나에게 부적합하다. 때로는 서버에 부하가 많이 걸리고 시간 초과가 너무 짧기 때문이다. – gleber

    +0

    서버 아키텍처를 수정한다면 어떻게 될까? 서버 실행 상태를 확인할 외부 서버 검사기를 작성하고 클라우드 가용성에 대한 응답을 보냅니다. 어떻게 생각해? SLA 스타일과 비슷 – Eugene

    +0

    이 예제는 [Adobe doc page] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html)에서 그대로 복사되었으며 100ms 시간 초과가 추가되었습니다. timeout 속성은 Flash 10 이상이며,이 경우 어쨌든 도움이되지 않습니다. 이 예제의 문제점은 실제로 위의 대답에서 설명한 것과 동일합니다. 리스너는 연결자가 연결 시도를 시작한 후 * 추가 ​​될 때까지 추가되지 않으므로 빠른 연결 오류가 완전히 누락 될 수 있습니다. no-args 생성자를 사용하고'connect (host, port)'를 호출하면이 문제를 피할 수 있습니다. – Lee

    0

    의 핵심은 이벤트 IOErrorEvent.IO_ERRORSocket 목적을들을 것입니다. 연결이 즉시 거부되는 경우에이 이벤트 이 즉시 트리거됩니다. 사실, 그것은 너무 빨리 (다음과 같이) 당신이 올바른 순서로 일을하지 않는 한 당신이 그것을 놓칠 것이라는 점을 트리거 할 수 있습니다 :

    // first create the unconnected socket, and add the listener 
    // you *must* add the listener *before* connecting the socket 
    // 
    var mySocket = new Socket(); 
    mySocket.addEventListener(IOErrorEvent.IO_ERROR, function(event:IOErrorEvent):void { 
        // called when error occurrs 
        trace("ioErrorHandler: " + event); 
    }); 
    mySocket.addEventListener(flash.events.Event.CONNECT, function(event:Event):void { 
        // handle a successful connection here 
        //... 
    }); 
    
    // now initiate the connection to port 80 on "server.example.com" 
    mySocket.connect('server.example.com', 80); 
    

    참고 :이 방법은 시간 제한을 기반으로하지입니다. 서버가 명확한 "connection refused"응답을 반환하면 IO Error 이벤트는 해당 응답을 받으면 즉시 발생합니다.

    시간 초과는 서버가 오랜 시간 동안 아무것도 반환하지 않을 때만 적용됩니다. 이는 특정 서버/방화벽 구성에서 실제로 ""이 패킷을 "연결 거부"를 반환하는 대신 자동으로 삭제하는 경우에 발생할 수 있습니다. 이 경우 클라이언트 (이 경우 플래시)는 제한 시간이 만료 될 때까지 대기합니다. 마지막으로 시간 초과가 만료되면 예상대로 IOErrorEvent.IO_ERROR 이벤트가 발생합니다.

    기본 소켓 시간 초과는 플랫폼에 따라 다르지만 항상 상당히 (~ 20-30 초 이상)입니다. Socket.timeout 속성은 Flash Player 버전 10 및 Air 1.0에 도입되었습니다. 지금까지 내가 아는 한 Flash Player 10 이전의 ActionScript를 사용하여 소켓 타임 아웃을 조정할 수있는 방법이 없습니다.

    행운을 빕니다!

    --- 편집 : 그것은 여전히 ​​작동하지 않는 경우, 읽어 --- 당신은 또한 플래시 플레이어가 소켓 정책 파일을 찾습니다 (그리고 필요) 방법에 대해 잘 알고 있어야

    .누락되었거나 깨진 소켓 정책 파일은 때로는 시간 초과시 대기중인 소켓처럼 보이는 동작을 생성 할 수 있습니다. this Adobe Document에서 인용 : 소켓 및 XML 소켓 연결에 대한

    액세스하면 연결중인 소켓이 SWF 파일과 동일한 도메인에있는 경우에도 기본적으로 비활성화되어 있습니다.

    • 포트 843 (마스터 정책 파일의 위치) 메인 소켓 연결
    • 같은 포트 : 다음 위치 중 하나에서 소켓 정책 파일을 제공하여 소켓 레벨 액세스를 허용 할 수 있습니다
    • 주 소켓 연결과 다른 포트는

    이 이전에 처음 연결하려고 할 때, Security.loadPolicyFile()를 사용하여 정책 파일을로드하지 않는 것을 의미 소켓을 서버에 연결하면 Flash는 먼저 정책 파일을 확인하려고 시도합니다. 경우에 따라 이상한 연결 지연 또는 기타 예기치 않은 동작이 발생할 수 있습니다. 이 문제가 발생할 것으로 생각되면 flash.events.SecurityErrorEvent.SECURITY_ERROR에 대한 리스너를 추가해야합니다.

    관련 문제