Не уверен, что вам нужно скрытно закрывать его, но я делаю на обратном вызове закрытия
_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' ) );
}
}
}