Forums Développement Multimédia

Aller au contenu

Connection Zend_AMF et AS3

CODE Actionscript

23 réponses à ce sujet

#1 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 15 January 2013 - 13:27 PM

Bonjour,

Dans le but de faire transiter des donner via Zend AMF ci-joint un petit lien.
http://framework.zen...amf.server.html
Je n'ai pas la bonne syntaxe pour un ecouteur.
Ma fonction onComplete n'ai pas lancé, alors que si je met un boutton qui lance la fonction ca marche.
J'ai essayé de bricoler cet ecouteur mais sans plus.
Merci d'avance pour vos conseils

Voici mon code


package {
  import flash.display.MovieClip;
  import flash.events.*;
  import flash.net.NetConnection;
  import flash.net.Responder;
  import flash.events.NetStatusEvent;
  import flash.events.SecurityErrorEvent;

  public class Main extends MovieClip {
 
private var gateway:String = "http://www.url.com/amftest.php";
private var connection:NetConnection;
private var responder:Responder;

public function Main() {

  //addEventListener(Event.COMPLETE, onComplete);

  responder = new Responder(onResult, onFault);
  connection = new NetConnection;
  connection.connect(gateway);
  connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
  connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);

}

private function netStatusHandler(event:NetStatusEvent):void {
  switch (event.info.code) {
   case "NetConnection.Connect.Success":
        onComplete();
        break;
   case "NetStream.Play.StreamNotFound":
        trace("Stream not found: ");
        break;
  }
}

private function securityErrorHandler(event:SecurityErrorEvent):void {
                        trace("securityErrorHandler: " + event);
                }

public function onComplete():void{

   trace("onComplete");
   var params = "Sent to Server";
   connection.call("World.hello", responder, params);
}

private function onResult(result:Object):void {
   // Display the returned data
   trace("result :" + String(result));
}
private function onFault(fault:Object):void {
   trace("fault :" + String(fault.description));
}
  }
}
 


#2 Monz

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3541 messages

Posté 15 January 2013 - 15:32 PM

Bonjour,

Tu dois faire ton connect

connection.connect(gateway);

après avoir enregistré les écouteurs, sinon, si la réponse arrive avant, effectivement, tu n'auras pas ton onComplete.

#3 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 15 January 2013 - 15:41 PM

Salut Monz et merci pour ta reponse.

J'ai essayé avec le connect apres les ecouteurs mais ca ne marche pas plus.
Je rajoute le code initial du tuto, qui ne marche pas non plus.


    package {
          import flash.display.MovieClip;
          import flash.events.*;
          import flash.net.NetConnection;
          import flash.net.Responder;
       
          public class Main extends MovieClip {
            private var gateway:String = "http://example.com/server.php";
            private var connection:NetConnection;
            private var responder:Responder;
       
            public function Main() {
                  responder = new Responder(onResult, onFault);
                  connection = new NetConnection;
                  connection.connect(gateway);
            }
       
            public function onComplete( e:Event ):void{
                  var params = "Sent to Server";
                  connection.call("World.hello", responder, params);
            }
       
            private function onResult(result:Object):void {
                  // Display the returned data
                  trace(String(result));
            }
            private function onFault(fault:Object):void {
                  trace(String(fault.description));
            }
          }
    }
 


#4 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 15 January 2013 - 16:07 PM

t'as pas une erreur dans les logs du serveur ?

#5 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 15 January 2013 - 16:20 PM

Salut Goa, merci pour le soutient.
Ben disons que ce qui est chelou c'est que ca marche avec un boutton.
Je rajoute le code ci-dessous.
Donc je me dis que ca vient forcement de l'ecouteur non ?


package {
  import flash.display.MovieClip;
  import flash.events.*;
  import flash.net.NetConnection;
  import flash.net.Responder;
  import flash.display.SimpleButton;
import flash.text.TextField;

  public class Main extends MovieClip {
private var gateway:String = "http://www.url.com/amftest.php";
private var connection:NetConnection;
private var responder:Responder;

public function Main() {
 
  //addEventListener(Event.COMPLETE, onComplete);

  responder = new Responder(onResult, onFault);
  connection = new NetConnection;
 
 
  connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
  connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
  connection.connect(gateway);
 
  var monBouton:SimpleButton = new SimpleButton();
 
  var normal:TextField = new TextField();
  var survol:TextField = new TextField();
  var clic:TextField = new TextField();
       
  // Label du bouton = "valider"
  normal.text = survol.text = clic.text = "Valider";
   
  // Le texte du survol sera de couleur rouge
  survol.textColor = 0xFF0000;
   
  // Le texte du clic sera de couleur bleue
  clic.textColor = 0x0000FF;
 
  monBouton.upState = normal;
  monBouton.overState = survol;
  monBouton.downState = clic;
  monBouton.hitTestState = normal;
 
  monBouton.addEventListener(MouseEvent.CLICK, callConnect);
 
  addChild(monBouton);
}

public function onComplete( e:Event ):void{
 
   trace("onComplete");
   var params = "Sent to Server";
   connection.call("World.hello", responder, params);
}

private function callConnect(pEvt:Event){
   var params = "Sent to Server";
   connection.call("World.hello", responder, params);
}

private function onResult(result:Object):void {
   // Display the returned data
   trace("result :" + String(result));
}
private function onFault(fault:Object):void {
   trace("fault :" + String(fault.description));
}
  }
}
 

Je rajoute egalement le contenu de ma page php, amftest.php au cas ou


<?php
class World
{
    /**
         * @param  string $name
         * @param  string $greeting
         * @return string
         */

    public function hello($name, $greeting = 'Hello')
    {
            return $greeting . ', ' . $name;
    }
}
//On charge Zend Framework
set_include_path('.' . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] . '/' . 'connecteurs/' . PATH_SEPARATOR . get_include_path());
require('Zend/Loader.php');
Zend_Loader::registerAutoload();
$server = new Zend_Amf_Server();
$server->setProduction(false); //Nécessaire en production pour masquer les erreurs.
$server->setClass('World');
$response = $server->handle();
echo $response;
/*$obj = new produit();
var_dump($obj);*/

 


#6 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 15 January 2013 - 16:51 PM

ben tu dois avoir des erreurs de compilation ? il manque des functions !!!

mais t'as bien le retour avec un code plus simple ?

package {
import flash.display.MovieClip;
import flash.events.*;
import flash.net.NetConnection;
import flash.net.Responder;
public class Main extends MovieClip {
  private var gateway : String = "http://www.url.com/amftest.php";
  private var connection : NetConnection;
  private var responder : Responder;
  public function Main() {
   connection = new NetConnection();
   responder = new Responder(onResult, onFault);
   connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
   connection.connect(gateway);
   //connection.call("World.hello", responder, 'hello chris');
   stage.addEventListener(MouseEvent.CLICK, callConnect);
  }
  private function securityErrorHandler(event : SecurityErrorEvent) : void {
   trace(this, 'securityErrorHandler', event);
  }
  private function netStatusHandler(event : NetStatusEvent) : void {
   trace(this, 'netStatusHandler', event);
  }
  private function callConnect(event : MouseEvent) : void {
   trace(this, 'callConnect', event);
   var params : String = 'hello chris';
   connection.call("World.hello", responder, params);
  }
  private function onResult(result : Object) : void {
   trace(this, 'onResult');
   for (var label:Object in result) {
    trace(label, ':', result[label]);
   }
  }
  private function onFault(fault : Object) : void {
   trace(this, 'onFault');
   for (var label:Object in fault) {
    trace(label, ':', fault[label]);
   }
  }
}
}
 


#7 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 15 January 2013 - 20:57 PM

Oui

quand je clic sur mon boutton
le trace


trace("result :" + String(result));
 

me renvoi bien

result :Hello, Sent to Server

Doit bien y avoir un moyen de placer un ecouteur sur cette fonction pour qu'elle soir appelé une fois la connexion etabli.
qui sait...

#8 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 15 January 2013 - 22:49 PM

J'ai rien compris ? avec ton histoire de connexion ?
tu veux lancer l'appelle a AMF directement ?

#9 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 09:13 AM

Salut Goa

Désolé si j'ai pas ete assez clair.
En fait oui j'aimerai que l'appel a AMF se fasse directement.

En l'etat j'ai le

  connection.call("World.hello", responder, params);
 
qui se fait quand on clic sur un boutton, et ca marche.

J'aimerai qu'il se fasse tout seul comme un grand une fois que le

connection.connect(gateway);
 
est ok

Mais je m'en sort pas avec l'ecouteur, je ne m'y prend pas bien je sais pas.
Et si je code le call juste apres la connexion comme ca


connection = new NetConnection();
responder = new Responder(onResult, onFault);
 
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
 
connection.connect(gateway);
 
connection.call("World.hello", responder, 'hello chris');
 

Ca marche mais il me semble bien que c'est pas clean car on attend pas que la connexion soit bien etabli.

#10 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 12:39 PM

Citation

Ca marche mais il me semble bien que c'est pas clean car on attend pas que la connexion soit bien etabli.
La connexion est établi a chaque call !

Ce qui n'est pas clean est d'avoir un Constructeur de class blindé mais bon sa viendra avec le temps et en attendant c'est pas ce genre de choses qui pourront planter ton application ;)

Par contre pourquoi choisir de communiquer via AMF ?

#11 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 13:32 PM

ok merci, si ca le fait c'est deja pas mal.

Pour tout te dire je bosse avec un developpeur php pour un projet de site avec une base prestashop
dans laquelle je compte incorporer un lecteur de media, son, image, video.

Du coup on en est a essayé de trouver la bonne methode pour faire transiter les données.

J'avais l'habitude de bosser avec AMFPHP sur les requettes bdd, ca marchait plutot pas mal.
QU'est ce que tu pense de Zend AMF, tu connais les deux lib ?
T'as deja mis en place ce genre de delir ?

Merci encore en tout cas

#12 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 13:56 PM

Oui, aujourd'hui j'utiliserais le format JSON pour les données texte.

Je garde sous la main un Zend_Amf_Server sous la main mais c'est une version modifié de la version existante pour qu'elle fonctionne avec l'autoloader de composer, et les namespaces, au cas ou j'ai un besoin de transférer des informations non serializable en natif.

Pour ce qui est des librairies, je sais juste que Zend a stopper le développement de Zend_Amf, et que la lib AMF_PHP est pas optimisé ( y'a un bench réalisé sur 1 000 000 de lignes provenant de mysql ou on ressent vraiment la difference.

Souvent je pose des questions pour que mon interlocuteur se pose lui aussi des questions.
En soit a tu fais le bon choix, pourquoi ne pas utiliser du json ou meme du xml ? y'a t'il vraiment un besoin de serializer les objets ? ... ?
(moi je ne pense pas que tu avais besoin de sortir l'artillerie lourde )

#13 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 14:40 PM

Effectivement, tu as surement raison.
On va resortir le bon vieux XML de derriere les fagos et ca va bien le faire.

Merci et la bonne journée a toi Goa !

#14 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 14:47 PM

Le json c'est mieux; aussi bien en php qu'en as3 et utilisable facilement avec du js.

http://php.net/manual/fr/book.json.php
http://help.adobe.co...ipt/3/JSON.html

#15 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 15:19 PM

De ce que j'ai pu lire, il y a deja eu une discussion a ce sujet sur ce forum,
Les deux se valent si ce n'est que le JSON a besoin d'une Lib externe alors que le XML est interpreté en natif.
Sans compté que je connais assez bien le XML et que j'ai jamais bosser avec JSON.
En meme temps je suis assez curieux de nature.
Donc !
Qu'est ce qui ferait pencher la balance coté JSON pour toi ?
Qu'entends tu par "mieux".

#16 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 15:31 PM

Le JSON est natif dans les version en cours du player !
Pour le json !

class Obj{
public $testA;
public $testB;
public $testC;
}
$class = new Obj();
$class->testA = 'A';
$class->testB = 'B';
$class->testC = 'C';
echo json_encode($class);
 

resultat :

Citation

{"testA":"A","testB":"B","testC":"C"}



pour la partie as3


   var handleComplete:Function = function(event:Event):void{
        var l:URLLoader = (event.currentTarget as URLLoader);
        l.removeEventListener(Event.COMPLETE, handleComplete);
        var o:Object = JSON.parse(l.data);
        for(var key:Object in o){
        trace(key,':',o[key]);
        }
 
   };
   var l:URLLoader = new URLLoader();
   l.addEventListener(Event.COMPLETE, handleComplete);
   l.load(new URLRequest('http://127.0.0.1'));
 
 

resultat :


Citation


[Info] Listening to port 7935.
[Info] Connection as server to player via 7935 established.
testC : C
testB : B
testA : A


voila quoi :)

Par mieux j'entends que c'est moins lourd a parser, que c'est respectueux des standarts ECMA ... le XML c'est bien mais faut écrire une doctype si on veux faire propre ( pour la validation .... ) !

#17 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 15:49 PM

mhm ca a l'air sympas effectivement et coté php c'est chi visiblement.

Par contre j'ai testé ton code et j'ai un

Séquence 1, Calque 'Calque 1', Image 1, ligne 4 1120 : Accès à la propriété non définie JSON.
 

C'est quoi du coup ce JSON tu le defini comment, t'as une classe ou faut faire un import ?
J'ai vu qu'il y en avait pas besoin visiblement sur la doc

#18 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 15:59 PM

Faut que mettre à jours ton Compilateur !!

#19 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 16:32 PM

Je compile toujours avec Flash CS5 en l'occurrence.
Je met a jour Flash ?

#20 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 16:47 PM

Ben oui, Flash et si possible le compilateur ( http://active.tutspl...essional-cs5-5/ )
le lien parle de Air mais il installe le SDK aussi

#21 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 16 January 2013 - 16:50 PM

Je test tout ca ce soir et je te dis.
Bien cool, encore merci

Daroob

Plus graphiste que codeur

#22 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 17 January 2013 - 15:23 PM

Salut Goa

J'ai la version CS5 et non CS5.5 j'ai l'impression que ca vient de la surtout le fait qu'il ne reconnaisse pas JSON.
J'ai fais la mise a jour du SDK, j'ai mis a jour la derniere version de AIR mais j'ai toujours un Accès à la propriété non définie JSON.

#23 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 17 January 2013 - 16:21 PM

( putain entre nous j'ai plus flash )
Mais je sais que sur le net tu peux trouver comment updater ce dernier (et il le faut vraiment dans un sens), cherche aussi sur le forum ( je crois que j'avais poster des liens ) ...



http://blogs.adobe.c...-and-cs5-5.html

#24 robin

    Ceinture Orange

  • Members
  • PipPipPip
  • 47 messages

Posté 18 January 2013 - 12:00 PM

Le retour de Json.
C'est tout bon, avec cs6...
Merci pour ton aide !
Je vais partir la-dessus je pense



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)