2010-05-17 9 views
0

J'essaie d'évaluer si Flex peut accéder aux sockets binaires. Il semble qu'il y ait un appel de classe Socket (paquet flex.net). L'exigence est que Flex se connecte à un serveur desservant des données binaires. Il s'abonnera ensuite aux données et recevra le flux qu'il interprétera et affichera sous forme de tableau. Je n'ai jamais travaillé avec Flex, mon expérience repose sur Java, donc tout est nouveau pour moi. J'essaie donc de mettre rapidement quelque chose en place. Le serveur Java attend les suivantes:Socket binaire et fichier de stratégie dans Flex

DataInputStream in = ..... 
byte cmd = in.readByte(); 
int size = in.readByte(); 
byte[] buf = new byte[size]; 
in.readFully(buf); 
... do some stuff and send binary data in something like 
out.writeByte(1); 
out.writeInt(10000); 
... etc... 

Flex, a besoin de se connecter à un localhost: 6666 faire la poignée de main et lire les données. Je suis quelque chose comme ceci:

 try { 
      var socket:Socket = new Socket(); 

      socket.connect('192.168.110.1', 9999); 
      Alert.show('Connected.'); 
      socket.writeByte(108); // 'l' 
      socket.writeByte(115); // 's' 
      socket.writeByte(4); 
      socket.writeMultiByte('HHHH', 'ISO-8859-1'); 
      socket.flush(); 
     } catch (err:Error) { 
      Alert.show(err.message + ": " + err.toString()); 
     } 

La première chose est que Flex fait un <policy-file-request/>. J'ai modifié le serveur pour répondre avec:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"> 

<cross-domain-policy> 
    <site-control permitted-cross-domain-policies="master-only"/> 
    <allow-access-from domain="192.168.110.1" to-ports="*" /> 
</cross-domain-policy>  

Après cela - EOFException se produit sur le serveur et c'est tout.

Donc la question est, est-ce que j'approche tout problème de données de streaming en mauvais quand il s'agit de Flex? Suis-je en train d'envoyer le fichier de politique erroné? Malheureusement, je n'arrive pas à trouver un bon exemple de la façon de le faire. Il me semble que Flex peut faire une application client-serveur binaire, mais personnellement, je manque de connaissances de base quand je le fais. J'utilise Flex 3.5 dans IntelliJ IDE IDE.

Toute aide est appréciée.

Merci!

Répondre

1

Je peux confirmer que Flex peut accéder aux sockets binaires. Il y a un ennui, cependant, que vous avez vu. Il va d'abord tenter de se connecter au port 843 sur l'hôte pour obtenir un fichier de stratégie et voir si la connexion est autorisée. Cependant, si cette connexion arrive à expiration (et qu'elle ne prend que 3 secondes pour obtenir une réponse), elle se connectera au port du serveur et demandera un fichier de politique (en envoyant < policy-file-request/>). Il lit le résultat et, si la connexion est jugée acceptable, il se connecte à nouveau au serveur pour subir le "vrai" protocole.

À moins que le serveur de fichiers de règles sur 843 ne soit garanti répondre rapidement, il est toujours possible que l'application Flex effectue la demande de fichier de stratégie sur le port du serveur. C'est un vrai problème de déploiement pour les services existants, mais pas si vous configurez le serveur vous-même, auquel cas vous devez juste vous assurer qu'une demande de fichier de politique peut être raisonnablement distinguée de tout démarrage initial de votre protocole.

Le fichier politique que j'ai RENVOYER ressemble à quelque chose comme ceci:

<?xml-version="1.0"?> 
<cross-domain-policy> 
    <allow-access-from domain="*" to-ports="1492"/> 
</cross-domain-policy> 

vôtre semble assez proche pour enregistrer le tag contrôle du site que je ne crois pas pertinent.

Ce qui est extrêmement utile, c'est d'activer la journalisation des demandes de fichiers de politique pour que vous puissiez avoir une idée de ce que Flex est en train de faire. Voici comment je le fais sur ma machine Vista; les chemins seront différents sous XP mais j'espère qu'au moins cette description vous donnera des termes de recherche web avec lesquels travailler.

D'abord, installez la version de débogage du lecteur Flash.

Activer la journalisation en mettant:

ErrorReportingEnable=1 
TraceOutputFileEnable=1 
PolicyFileLog=1 
#PolicyFileLogAppend=1 # optional but possibly useful 

En C: /Users/George/mm.cfg

Maintenant, vous devriez voir deux fichiers apparaissent dans C: \ Users \ George \ AppData \ Roaming \ Macromedia \ flash player \ Logs ":

flashlog.txt 
policyfiles.txt 

policyfiles.txt est celui que vous voulez regarder pour voir quels fichiers politiques ont été récupérés et comment Flex a décidé de répondre à leur flashlog.txt est très utile aussi. , pour capturer la sortie de trace() mais vous pourriez l'obtenir de votre IDE de toute façon.

une chose. L'ajout d'écouteurs d'événement à la socket est utile pour distinguer les erreurs de type E/S des violations de règles de sécurité. Voici les événements que j'écoute:

socket.addEventListener(Event.CONNECT, ServerConnect); 
socket.addEventListener(Event.CLOSE, ServerClose); 
socket.addEventListener(IOErrorEvent.IO_ERROR, ServerIOError); 
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError); 
+0

Vous pouvez spécifier le port lors du chargement du fichier de stratégie à l'aide de la méthode Security.loadPolicyFile. J'ai écrit un article ici http://cornelcreanga.com/2008/11/bringing-data-into-flex-applications-introduction/ –

+0

Merci! Ça a marché. Il se connecte bien. Maintenant, je dois comprendre comment lire les données dans le socket asynchrone dans Flex. Existe-t-il un protocole de messagerie en temps réel gratuit pour Flex? Je vois qu'ils fournissent une solution commerciale, mais puis-je le faire gratuitement en quelque sorte? – Daniil