La clé est d'écouter l'objet Socket pour l'événement IOErrorEvent.IO_ERROR
. Dans le cas où vous faites référence, où la connexion est refusée immédiatement, cet événement sera déclenché immédiatement. En fait, il peut être déclenché si rapidement que vous le manquer, sauf si vous faites les choses dans le bon ordre (comme indiqué ici):
// 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);
NOTE: cette approche est pas basée sur un délai d'attente. Si le serveur renvoie une réponse définie "connexion refusée", l'événement Erreur E/S se produit immédiatement lorsque cette réponse est reçue.
Le délai d'expiration s'applique uniquement lorsque le serveur ne renvoie rien pendant une période prolongée. Cela peut arriver avec certaines configurations serveur/pare-feu qui en fait abandonnent les paquets en silence plutôt que de retourner "connection refused". Lorsque cela se produit, le client (dans ce cas, Flash) attendra que le délai expire. Lorsque le délai expire, il en résulte un événement IOErrorEvent.IO_ERROR
comme prévu.
Le délai d'attente de socket par défaut dépend de la plate-forme, mais il est toujours assez long (~ 20-30 secondes ou plus). La propriété Socket.timeout
est présentée dans Flash Player version 10 et Air 1.0. Pour autant que je sache, il n'y a aucun moyen d'ajuster le délai de socket en utilisant ActionScript avant Flash Player 10.
bonne chance!
--- EDIT: si elle ne fonctionne toujours pas, poursuivez votre lecture ---
Vous devez également connaître la façon dont le lecteur flash cherche (et nécessite) un fichier de stratégie de prise.Les fichiers de stratégie de socket manquants ou endommagés peuvent parfois produire un comportement qui ressemble à un socket en attente de délai. Je cite this Adobe Document:
accès à socket et connexions socket XML est désactivé par défaut, même si la prise vous connectez est dans le même domaine que le fichier SWF. Vous pouvez autoriser la prise de niveau accès en servant un fichier de stratégie de prise de l'un des endroits suivants:
- Port 843 (l'emplacement du fichier de stratégie maître)
- Le même port que la connexion principale de prise
- un autre port que la connexion socket principale
Cela signifie que, à moins que vous avez déjà chargé un fichier de stratégie à l'aide Security.loadPolicyFile()
, lorsque vous essayez d'abord de se connecter votre socket sur le serveur, flash va d'abord essayer de résoudre un fichier de politique. Dans certains cas, cela peut entraîner des retards de connexion étranges ou d'autres comportements inattendus. Si vous pensez que vous rencontrez ce problème, vous devez commencer par ajouter un écouteur pour flash.events.SecurityErrorEvent.SECURITY_ERROR
.
Est-ce que onerror est pris en charge dans tous les navigateurs? Est-il déclenché lorsque le serveur ne renvoie rien? – gleber
Oui, le mieux est que le serveur puisse répondre avec une réponse vide sur GET/- puis, les appels successifs sont appelés. http://www.w3schools.com/jsref/event_img_onerror.asp - ressemble à onerror pris en charge dans tous les navigateurs. au moins à l'opéra/iceweasel/ie ça marche pour moi. – datacompboy
Merci pour une suggestion, mais cela semble être seulement une solution de contournement. Je vais attendre un peu plus. Peut-être existe-t-il une vraie solution? – gleber