AS3 XMLSocket не может обнаружить разъединение на стороне клиента
Внутри приложения Flex (не AIR, а Flash Player) у меня запущен XMLSocket, и я не могу понять, как обнаружить разъединение на стороне клиента. Например, когда я подключаюсь к удаленному серверу со своего компьютера, а затем отключаю компьютер от Интернета, сокет полагает, что он все еще подключен (нет IOError или события закрытия выдается). В моем классе сокетов он отправляет сообщение в сокет каждые две секунды, в надежде, что после разрыва соединения он обнаружит IOError в XMLSocket.send(), но даже это не работает! Он все еще пытается отправить данные и не выдает исключение, хотя, безусловно, это не удается.
Когда подключение к Интернету установлено, сервер сокетов на удаленном сервере принимает сообщение от клиента Flex.
Я изучил SocketMonitor и URLMonitor, но они доступны только для AIR, а не для Flash Player.
Я думаю, что в сокетах есть что-то фундаментальное, чего я не понял. Кто-нибудь может помочь?
package org.MB.components
{
import flash.errors.IOError;
import flash.events.DataEvent;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.events.TimerEvent;
import flash.net.XMLSocket;
import flash.utils.Timer;
import org.MB.appData.DataHolder;
import org.MB.utils.XMLUtils;
public class MBSocket extends XMLSocket
{
private var timer:Timer;
private var _host:String;
private var _port:int;
public function MBSocket(host:String=null, port:int=0)
{
super(host, port);
this._host = host;
this._port = port;
addListeners();
}
public function addListeners():void
{
addEventListener(Event.CLOSE, onClose);
addEventListener(Event.CONNECT, onConnect);
addEventListener(IOErrorEvent.IO_ERROR, onIOError);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
addEventListener(DataEvent.DATA, onData);
}
//Various event handlers and code to deal with the two-second timer here
protected function onConnectedTimer(e:TimerEvent):void
{
//I get this traced message, and no IOError is thrown
trace("SENDING TEST");
this.send(':::\0');
}
}