IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

communication Java / player Flash via XMLSocket


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut communication Java / player Flash via XMLSocket
    Salut à tous.

    J'essaye de coder une appli air qui lance une animation après qu'un client se soit approché et scanné sa carte "cora" avec un code-barre.

    Évidemment, question port-série, Flash c'est pas top ...

    D'où la création d'un petit démon java, qui écoute le port série, ouvre un port TCP, et sur l'évènement SerialEvent de RXTX
    envoie la code-barre à Flash via le port TCP.

    Le problème, c'est que je n'arrive pas à envoyer les données vers Flash.

    Es-ce que le "processus socket" peut être à l'initiative du serveur ?

    Les exemples sur le net font plutôt preuve d'init des clients....

    J'ai essayé via un Timer dans l'appli air d'envoyer une requête ttes les seconde, mais quand je débugge, je n'arrive pas bien à voir pourquoi ça s'arrête au niveau du processus d'échange.

    Avec le code, ça sera plus clair ...

    La méthode qui écoute SerialEvent et lance Communicate ( la connection socket est faites en amont et fonctionne ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    case SerialPortEvent.DATA_AVAILABLE :
     
    try
    {
     
    	setsBarCode( (String) bFlux.readLine() );
     
    	System.out.println( "sBarCode, Serial : "+ sBarCode );
     
    	sktSrvr.communicate( getsBarCode(), jTxtARef );
     
    }
    catch ( IOException e )
    {
    	System.out.println("Error: I/O Exception");
    	e.printStackTrace();
    }
    break;
    Le code de communicate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public void communicate( String sBarCode, JTextArea jTxtA )
    {
    	System.out.println( "test" );
     
    	try
    	{	
    	System.out.println( "sBarCode, SocketServer : "+ sBarCode );
     
    	BufferedReader  in = new BufferedReader(new InputStreamReader(_connection.getInputStream()));
     
    	PrintWriter out = new PrintWriter( _connection.getOutputStream(), true );
     
    	while( true )
    	{	 
    	try
    		{
    		    String line = in.readLine();
     
    	            out.println(line);
    	         } 
    	         catch (IOException e) {
    	             System.out.println("Read failed");
    	             System.exit(-1);
                      }
    	}
             catch (IOException e) {
    			e.printStackTrace();
    		}
    }
    Le client Flash avec le Timer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private function onTimer( e:TimerEvent ):void {
     
    				logger.log( "onTimer: " + i, this);
    				i++;
    				if( i > 2 ){
                    	var s:String = "<?xml version='1.0' encoding='UTF-8'?><root>DATA<data></data></root>"
                    	_socket.send(s);
        			}
            }

    Donc j'ai bien une connexion, mais le code semble planter silencieusement au niveau de l'envoie de données : String line = in.readLine();

    J'ai plus trop d'idée.

  2. #2
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    Bon, j'ai laissé de coté le port série pour le moment.

    Je lance une requete XML coté Flash, qui arrive bien dans JAVA, mais ensuite plus rien. Pas d'erreur, mais aucune donnée ne semble arriver dans Flash.

    Voici le code qui envoie le requete initiale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function connect():void{
     
        _addListeners();
        _socket.connect(_hostname,_port);
     
        var s:XML = new XML("<?xml version='1.0' encoding='UTF-8'><root><data>DATA</data></root>");
     
        _socket.send(s);		
    }
    Voici le code Java qui lit les flux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public void getStreams() throws IOException
    {
     
        _bufferReader = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
     
         PrintWriter _printWriter = new PrintWriter( _socket.getOutputStream(), true );
     
        boolean done = false;
     
        while (!done)
        {	
                String str = _bufferReader.readLine();
     
                if (str == null){
                    done = true;
                }
                else{   
     
                	_printWriter.print(str+"\n");
                	_printWriter.flush();
     
                    System.out.println(str);
     
                    if( str.trim().equals("EXIT")){
                        done = true;
                    }
                }
         }
    }
    ce code affiche bien le xml envoyé : System.out.println(str);

    L'écouteur Flash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private function dataHandler(event:DataEvent):void {
     
       var t:Text = new Text();
       t.text = event.data;
     
     
       MainApplication.GLOBAL_STAGE.addChild(t);
     
     
       logger.log("dataHandler: " + event,this);
    }

    Qu'est-ce qui pourrait faire que les données n'arrive pas dans Flash ?

  3. #3
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    Je continue de parler tout seul

    Vous croyez que c normal que côté Flash j'envoie du XML, alors que côté Java c une simple String ?

    Comment fait-on en java pour créer du XML ? J'ai bien vue des lib pour travailler des fichiersz xml, mais je voudrais créer un petit "snippet" de xml ?

    Vous croyez que ça serait plus simple si coté flash j'instanciais un Socket (san,s le xml ) ?

  4. #4
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    Bon je continue à m'auto parler.

    J'ai abandonné le xml, et codé un socket normal.

    Voici le code qui fonctionne :

    Flash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public function RawSocket( hostname:String="localhost", port:uint=8080 )
    {
            _hostname = hostname;
    	_port = port;
     
    	_rawSocket = new Socket();
    }
     
    public function connect():void
    {	
    	_addListeners();
     
    	_rawSocket.connect( _hostname, _port );
    }
     
    private function _addListeners():void
    {			
    	    _rawSocket.addEventListener(Event.CLOSE, closeHandler);
                _rawSocket.addEventListener(Event.CONNECT, connectHandler);
                _rawSocket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
     
                _rawSocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                _rawSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
     
    }
     
    private function connectHandler(event:Event):void {
                logger.log("connectHandler: " + event,this);
                sendRequest();
    }
     
    private function sendRequest():void {
            logger.log("sendRequest");
            _response = "";
            writeln("GET /");
            _rawSocket.flush();
    }
     
    private function writeln( str:String):void {
            str += "\n";
            try {
                	_rawSocket.writeUTFBytes(str);
            }
            catch(e:IOError) {
                	logger.log(e);
            }
    }
     
    private function socketDataHandler( event:ProgressEvent ):void {
            logger.log("socketDataHandler: " + event);
            var str:String  = _rawSocket.readUTFBytes( _rawSocket.bytesAvailable );
            logger.log("socketDataHandler str: " + str, this);
            var t:Text = new Text();
            t.text = _response;
            MainApplication.GLOBAL_STAGE.addChild(t);
    }

  5. #5
    Membre confirmé Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Par défaut
    Maintenant j'ai un problème de synchronisation entre le code java chargé d'écouter le port série, et le code chargé d'envoyer le contenu du port série vers flash.

    Je pense qu'il s'agit d'un problème de synchronisation des thread que je maîtrise mal

    Voici le main de ma classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public static void main( String[] args )
    	{	
    		TestWindow testWindow  = new TestWindow("Essai.");
    		testWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		testWindow.setSize(300, 100);
    		testWindow.setVisible(true);
     
    		JRootPane rootPane = testWindow.getRootPane();
     
    		Container contentPane = rootPane.getContentPane();
     
    		final JTextArea jTxtA = new JTextArea();
    		contentPane.add(jTxtA);
     
    		SerialListener = new SerialPortListener( portCom, jTxtA );
     
    		_socketWrapper = new SocketWrapper(  jTxtA  );
    		_socketWrapper.runServer( _socketPort );
     
    		try{
     
    			SerialListener.start( _socketWrapper );
            }
            catch ( Exception e ){
            	System.out.println("Error: 1ere Exception");
                e.printStackTrace();
            }
            finally{
            	_socketWrapper.closeConnection();
            }
     
    	}

    Voici le code de la classe serialListener qui écoute le port série et devrait envoyer la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    	public void run( SocketWrapper _socketWrapper )
    	{
    		running = true;
     
    		_socketWrapperRef = _socketWrapper;
     
    		while (running)
    		{
    			try {
    				Thread.sleep(1000);
    			}
    			catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
     
    		try{
    			_serialBuffer.close();
    			_commPort.close();
    		}
    		catch (IOException e){
    			displayMessage("Error: I/O Exception");
    			e.printStackTrace();
    		}
     
    	}
     
    	public synchronized void  serialEvent( SerialPortEvent event )
    	{
    		switch( event.getEventType() )
    		{
    			case SerialPortEvent.BI :
    			case SerialPortEvent.OE :
    			case SerialPortEvent.FE :
    			case SerialPortEvent.PE :
    			case SerialPortEvent.CD :
    			case SerialPortEvent.CTS :
    			case SerialPortEvent.DSR :
    			case SerialPortEvent.RI :
    			case SerialPortEvent.OUTPUT_BUFFER_EMPTY :
    				break;
     
    			case SerialPortEvent.DATA_AVAILABLE :
     
    				try{
    					setsBarCode( (String) _serialBuffer.readLine() );
     
    					_socketWrapperRef.sendResponse( getsBarCode() );
     
    					displayMessage( "sBarCode, Serial : "+ sBarCode );
    				}
    				catch ( IOException e ){
    					displayMessage("Error: I/O Exception");
    					e.printStackTrace();
    				}
    				break;
    		}
    	}
    Dès lors qu'il y aune connection d'établie avec Flash, l'événement port-série n'est plus appelé, comme si l'événement était mis dans EventQueue, mais je ne vois pas pourquoi.

    [Le code du serveur de socket est dans mes messages précédent ]

Discussions similaires

  1. FlashDevelop et test via le player Flash
    Par Madfrix dans le forum EDI/Outils
    Réponses: 1
    Dernier message: 12/05/2011, 22h48
  2. Communication Java - Silverlight via Socket
    Par Seb59118 dans le forum Silverlight
    Réponses: 4
    Dernier message: 02/12/2009, 17h53
  3. [FLASH][SOCKET] XMLsocket sous Flash
    Par Muetdhiver dans le forum Dynamique
    Réponses: 3
    Dernier message: 29/10/2009, 11h38
  4. probleme communication entre getUrl flash et page html via ajax
    Par sooprano dans le forum Intégration
    Réponses: 0
    Dernier message: 08/07/2009, 16h00
  5. Réponses: 0
    Dernier message: 23/11/2008, 00h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo