Transférer une image, un swf ou tout autre fichier binaire entre 2 clients connectés à FMS3
février 8th, 2009 by Tony
La dernière version de Flash Media Server destinée aux développeurs, nommée Flash Media Interactive Server 3, supporte désormais le protocole AMF3.
Qu’est-ce à dire ?
Hé bien, cela veut dire que vous pouvez à présent envoyer vers votre serveur fms3 un certain type de données que l’on appelle ByteArray (entre autres…)
Ca à l’air de rien comme çà, mais c’est hyper pratique en fait
Imaginons, par exemple, que je veuille ajouter une fonctionnalité à mon application fms qui permette de transférer une image chargée dans la vue de l’un des clients vers les autres clients connectés, je pourrais écrire quelque chose comme ceci :
var nc:NetConnection = new NetConnection(); // création d'un objet NetConnection en spécifiant que l'on utilise AMF3 nc.objectEncoding = ObjectEncoding.AMF3; // ... Manager votre connexion ici (addEventListener, connect(), etc.) // Encapsulons un objet BitmapData dans un ByteArray var imageData:BitmapData = new BitmapData( 250, 250, false ); imageData.draw( image_mc ); // Dessine le MovieClip image_mc dans l'objet BitmapData var encodeur:JPEGEncoder = new JPEGEncoder( 70 ); // Création d'un objet JPEGEncoder (corelib Adobe) avec un niveau de qualité 70 var ba:ByteArray = encodeur.encode( imageData ); // Encodage du BitmapData dans un Objet ByteArray nc.call( "test1", null, ba ); // Disposant d'un objet NetConnection connecté à fms3, on peut appeler la méthode distante "test1" en lui transmettant notre image encodée sous format jpeg imageData.dispose(); // ce BitmapData ne nous sert plus à rien : libérons donc la mémoire.
Alors, vous allez me dire : “Oui, c’est bien…l’image est envoyée…et comment les autres clients vont-ils la charger ?”
Et bien, l’image est envoyée, certes, mais nous pouvons la charger comme ceci :
// Affectons à la propriété client de notre objet NetConnection, une instance de classe personnalisée nommée CustomClient // et passons lui une référence à nous même nc.client = new CustomClient( this ); ... // Cette classe CustomClient pourait ressembler à ceci class CustomClient { import flash.display.Loader; import flash.display.MovieClip; var _pEnv:MovieClip; public function CustomClient ( pEnv:MovieClip ) { // Stockons une référence à l'objet Document de classe _pEnv = pEnv; } /** * Méthode appelée depuis FMS sur tous les clients connectés * Il est important que cette méthode soit publique, car elle est appelée par RPC (ou Remote Procedure Call) * @param p contient les données binaires de l'objet ByteArray transmis au serveur fms3 qui nous sont renvoyées ici */ public function receivingImage( p:* ):void { var buffer:* = p; // Créons un sous-type de DisplayObject : Loader var loader:Loader = new Loader(); // Passons-lui une référence à l'objet envoyé par fms3 (et contenant notre image) loader.loadBytes( buffer ); // Et ajoutons-le à la DisplayList _pEnv.addChild( loader ); } }
Et voilà, l’objet Loader agit comme un proxy pour l’objet graphique qui va être affiché.
Il dispose d’une méthode loadBytes(p:ByteArray) recevant un objet ByteArray en argument.
C’est à cette méthode que nous transmettons les données binaires ayant transitées entre le swf d’envoi, fms3 et les swfs receveurs.
Alors, bien sûr, je transfère une image…mais pourquoi n’enverrions-nous pas des données xml, un swf, ou carrément des fichiers bureautiques pour faire de l’échange de fichiers (avec la librairie AlivePDF on peut même transférer du contenu binaire au format pdf).
Tout cela est possible, grâce notamment à la classe FileReference et ses méthodes load() et save() disponible dans l’API du Flash Player 10.
Vous trouverez également des librairies AS3 qui permettent de compresser/décompresser les données à envoyer (compression zip) afin de gagner encore en rapidité.
Mais Comment Faisons t-on Avant ?
- Posted in Non classé
juillet 1st, 2010 at 5 h 43 min
Buy:Wellbutrin SR.Amoxicillin.Aricept.Zocor.Female Pink Viagra.Acomplia.Benicar.Lasix.Prozac.Buspar.Advair.Female Cialis.Cozaar.Lipitor.Seroquel.Nymphomax.SleepWell.Zetia.Ventolin.Lipothin….