Событие закрытия подключения через сокет в ActionScript - PullRequest
1 голос
/ 18 июля 2011

Кто-нибудь знает, почему событие Close Close не отправляется после того, как я отключил соединение Wi-Fi? Или любым способом определить, активно ли соединение.

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Не уверен, что вам нужно скрытно закрывать его, но я делаю на обратном вызове закрытия

_socket.addEventListener(Event.CLOSE, onClose);

private function onClose(e:Event):void {
  _socket.close();
}

Вы также можете проверить во время соединения, чтобы убедиться, что оно еще не подключено

if( !_socket.connected ){
  try {
    _socket.connect(host, port);
    this.dispatchEvent( new Event( 'CONNECTING' ) );
  } catch (e:Error) {
    _socket.close();
    this.dispatchEvent( new Event( 'ERROR' ) );
  }
}

[РЕДАКТИРОВАТЬ]Если соединение с сервером потеряно, событие закрытия соединения не сработает, вы должны проверить это, если хотите восстановить соединение.Для этого вам нужно настроить таймер для опроса соединения.Следующий класс будет продолжать соединять розетку и, если он не подключен, он попытается восстановить соединение.Я сократил и удалил функции отправки и не относительную информацию.Как вы можете видеть, у меня есть таймер, который запирает сокет, а также время ожидания после стольких попыток.Этот класс попытается сохранить ваш сокет живым, если он закроется.Очевидно, вам нужно назначить порт и хост.

package{
  import flash.events.Event;
  import flash.events.IOErrorEvent;
  import flash.events.ProgressEvent;
  import flash.events.SecurityErrorEvent;
  import flash.events.TimerEvent;
  import flash.net.Socket;
  import flash.system.Security;
  import flash.utils.Timer;

  public class MySocket extends Socket {
    [Event(name="ERROR")]
    [Event(name="CONNECTED")]
    [Event(name="DISCONNECTED")]
    [Event(name="CONNECTING")]
    [Event(name="TIMIEDOUT")]

    private var host:String;
    private var port:Number;
    private var connectTimer:Timer;
    private var retryCount:int;

    public var err:String;

    public function MySocket(  ){
      this.retryCount = 0
      Security.allowDomain(this.host);
      Security.loadPolicyFile("xmlsocket://"+this.host+":"+this.port);
      this.addEventListener(ProgressEvent.SOCKET_DATA, this.onResponse);
      this.addEventListener(Event.CONNECT, this.onConnect);
      this.addEventListener(Event.CLOSE, this.onClose);
      this.addEventListener(IOErrorEvent.IO_ERROR, this.onIOError);
      this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, this.onSecurityError);
      this.dispatchEvent( new Event( 'DISCONNECTED' ) );
      this.err = '';
      this.connectTimer = new Timer( 1000 );
      this.connectTimer.addEventListener(TimerEvent.TIMER, this.myConnect );
      this.connectTimer.start();
    }

    private function onResponse(e:ProgressEvent):void {
      var read:String = this.readUTFBytes(this.bytesAvailable );
      if( read.charAt(0) !='<' ){
        if( read ){
          // the server response here
        }
      }else{
        // recieved crossdomain policy do nothing
      }
    }
    public function myConnect( e:TimerEvent ):void{
      if( !this.connected ){
        try {
          this.connect(this.host, this.port);
          this.dispatchEvent( new Event( 'CONNECTING' ) );
        } catch (e:Error) {
          this.close();
          this.err = e.message;
          this.dispatchEvent( new Event( 'ERROR' ) );
        }
      }
    }
    private function onConnect(e:Event):void {
      this.retryCount = 0
      this.err = '';
      this.dispatchEvent( new Event( 'CONNECTED' ) );
    }
    private function onClose(e:Event):void {
      this.close();
      this.dispatchEvent( new Event( 'DISCONNECTED' ) );
    }
    private function onIOError(e:IOErrorEvent):void {
      ++this.retryCount;
      if( this.retryCount >= 12 ){
        this.connectTimer.stop();
        this.dispatchEvent( new Event( 'TIMIEDOUT' ) );
      }else{
        this.err = 'IO-ERROR-EVENT - ' + e.text + '\r\nAttempting to reconnect';
      }
    }
    private function onSecurityError(e:SecurityErrorEvent):void {
      this.err = 'SECURITY-ERROR - ' + e.text;
      this.dispatchEvent( new Event( 'ERROR' ) );
    }
  }
}
2 голосов
/ 18 июля 2011

Из документов:

Dispatched when the server closes the socket connection.

Сервер закрывает соединение, отправляя пакет FIN и ожидая ACK. Как я вижу, вы просто отключили свой Wi-Fi, чтобы удаленный сервер не мог отправить FIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...