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'); 
    }
}

0 ответов

Другие вопросы по тегам