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

API standards et tierces Android Discussion :

Bouton et socket


Sujet :

API standards et tierces Android

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut Bouton et socket
    Bonjour,

    je cherche depuis quelque temps un exemple de code pour créer un bouton qui ouvre un socket et envoi un texte.

    Ci après
    mon main activity qui gère une interface avec des boutons fonctionnels:
    ma class avec un socket fonctionnel
    je n'arrive pas a lier les deux


    ****************************************************
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    package com.example.planar2;
     
     
     
    import android.app.Activity;
     
    import android.os.Bundle;
     
    import android.view.View;
     
    import android.view.View.OnClickListener;
     
    import android.widget.Button;
     
    import android.widget.Toast;
     
     
     
    public class MainActivity extends Activity implements OnClickListener {
     
     
     
           private Button buttonWithActivityAsListener;
     
           private Button buttonWithInnerClassAsListener;
     
           private Button buttonWithInlineAsListener;
     
     
     
     
     
           /** Called when the activity is first created. */
     
        @Override
     
        public void onCreate(Bundle savedInstanceState) {
     
            super.onCreate(savedInstanceState);
     
            setContentView(R.layout.main);
     
     
     
            buttonWithActivityAsListener = (Button) findViewById(R.id.button_with_activity_as_listener);
     
            buttonWithActivityAsListener.setOnClickListener(this);
     
     
     
            buttonWithInnerClassAsListener = (Button) findViewById(R.id.button_with_inner_class_as_listener);
     
            buttonWithInnerClassAsListener.setOnClickListener(new InnerOnClickButtonListener());
     
     
     
            buttonWithInlineAsListener = (Button) findViewById(R.id.button_with_inline_class_as_listener);
     
            buttonWithInlineAsListener.setOnClickListener(new OnClickListener() {
     
                        public void onClick(View v) {
     
                               Toast.makeText(MainActivity.this, "Button with Inline Class as Listener has been clicked.", 2500).show();
     
                        }
     
                 });
     
        }
     
     
     
        /** You implement this method after adding OnClickListener interface to your Activity. **/
     
           public void onClick(View v) {
     
                 Toast.makeText(this, "Button with Activity as Listener has been clicked.", 2500).show();
     
           }
     
           //
     
     
     
           /** Name of the method and it's triggering comes from main.xml file.
     
           * Button's widget attribute android:onClick allows you to specify name of the method
     
           * which you have to implement. **/
     
           public void onButtonClick(View v) {
     
             Toast.makeText(this, "Button lancant le socket.", 2500).show();
     
     
     
           }
     
           //
     
     
     
           /** Inner Class to respond to OnClick events. **/
     
           class InnerOnClickButtonListener implements OnClickListener {
     
                 public void onClick(View v) {
     
                        Toast.makeText(MainActivity.this, "Button with Inner Class as Listener has been clicked.", 2500).show();
     
                 }
     
           }
     
    }
    ****************************************

    Socket

    *****************************************
    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
    60
    61
    62
    63
    64
    65
    66
     
    package com.example.planar2;
     
    import java.io.*;
     
    import java.net.*;
     
     
     
    public class Client_Socket {
     
      public static void main(String[] args) throws IOException
     
      {
     
        Socket comm = null;
     
        InputStream is = null;
     
     
     
        try
     
        {
     
          comm = new Socket("192.168.1.11", 7072);
     
     
     
          comm.getOutputStream().write("image_delete -1 gui\n\n".getBytes());
     
          is = comm.getInputStream();
     
          int c;
     
          while((c = is.read()) != -1)
     
            System.out.write(c);
     
        }
     
        catch(Exception e)
     
        {
     
          System.err.println("Exception " + e.toString());
     
        }
     
        finally
     
        {
     
          if (is!=null)
     
             is.close();
     
          if (comm!=null)
     
             comm.close();
     
        }
     
      }
     
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ne pas oublier la balise CODE !

    Qu'est ce que tu n'arrives pas à faire ? Qu'as tu essayé ? Ou est-ce que ça coince ? Quelle erreurs as-tu ?

    Parceque le code que tu montre c'est deux classes complètement séparées....

    Une classe d'activité avec les 3 façons d'implémenter un "listener" sur un bouton (à priori une seule suffit non ?)

    Une classe (enfin... peut-on parler d'une classe...), disons plutôt un "holder" de fonction "main" qui ouvre un socket et écrit dedans....

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut précision
    Bonjour,

    j'ai gardé les différentes implémentations des boutons pour mémoire (la mienne).

    J'aimerais que l'un de ces boutons (par exemple celui avec le label "Button lancant le socket") ouvre un socket sur un Ip et un port pré défini et envoi un texte.

    plusieurs amis m'ont donné des tuyaux que j'ai essayé d'intégrer à "mon" code mais mon niveau en java est trop faible pour le moment pour avancer.

    Dans l’idéal la méthode aurait comme paramètre le texte a envoyer sur le Socket.

    j'ai fouillé le web à la recherche d'un exemple de code sans succès.

    Xavier

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    C'est là ou je ne comprends pas... tu as déjà "pasté" tout le code nécessaire dans le premier message...

    Si le problème se situe dans l’exécution, poste ici le code complet, et l'erreur d’exécution..

    Si le problème se situe à la compilation, poste ici le code complet, en marquant en rouge les problèmes de compilation que tu as (eclipse est assez bon en auto-completion et auto-correction pour normalement ne pas en avoir, mais qui sait)

    Si le problème se situe à "comment on appelle une fonction en java", je t'enjoins à rapidement ouvrir un cours d'initiation à la programmation.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut un peu d'aide
    Bonjour,

    oui mon problème est bien que je ne sais pas faire correctement l'appel d'une fonction en java dans mon cas précis .
    Ça va sans doute venir

    j'ai lu pas mal de post et je suis en train d'essayer de m'initier à Java mais ce ne rentre pas facilement pour le moment.

    Une idée ou un forum pour débutant à me conseiller?

    merci

  6. #6
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Une idée ou un forum pour débutant à me conseiller?
    http://www.developpez.net/forums/f93...-java/debuter/

    Après vu ce que tu as posté comme code, tu avais les éléments il te manquait plus qu'à les liés

    Regarde d'abord les tuto sous Java et Cours
    http://java.developpez.com/cours/

    Si tu as toujours un problème reviens nous voir .

    Bonne journée

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut conexion socket refusée
    Bonjour,

    j'ai avancé sur le sujet

    Pour tester l'application j'utilise un logiciel sur mon pc qui crée un serveur sur le port 7072
    J'ai testé le serveur sur mon mobile via un appli android et la connexion socket se fait bien sur ce port

    Quand j'appuie sur le bouton "Planar" je reçois sur le mobile une erreur
    Exeption java.net.socketexeption: socket failed EAcces (permission denied)

    Je pense que cela viens de la premiere class?


    CLASS 1
    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
     
    package com.example.planar;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
     
     
    public class ClientSocket {
     
    	public String call(final String imageName) throws IOException
     
    	  {
    	    Socket comm = null;
    	    InputStream is = null;
    	    String returnString = null;
     
    	    try
    	    {
    	      comm = new Socket("192.168.0.10", 7072);
    	      comm.getOutputStream().write(imageName.getBytes());
    	      is = comm.getInputStream();
    	      int c;
    	      while((c = is.read()) != -1)
    	      returnString+=c;
    	    }
     
    	    catch(Exception e)
     
    	    {
    	     returnString ="Exception " + e.toString();
    	    }
    	    finally
     
    	    {
    	      if (is!=null)
    	      is.close();
    	      if (comm!=null)
    	      comm.close();
    	    }
     
    	  return returnString ;
    		}
    	}
    CLASS 2
    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
    60
    61
    62
    63
    64
    65
    66
     
    package com.example.planar;
     
    import java.io.*;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
     
    public class MainActivity extends Activity implements OnClickListener {
     
    	private Button buttonWithActivityAsListener;
    	private Button buttonWithInnerClassAsListener;
    	private Button buttonWithInlineAsListener;
    	private final ClientSocket clientSocket = new ClientSocket();
    	private String imageName ="image_delete -1 gui\n\n";
     
     
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            buttonWithActivityAsListener = (Button) findViewById(R.id.button_with_activity_as_listener);
            buttonWithActivityAsListener.setOnClickListener(this);
     
            buttonWithInnerClassAsListener = (Button) findViewById(R.id.button_with_inner_class_as_listener);
            buttonWithInnerClassAsListener.setOnClickListener(new InnerOnClickButtonListener());
     
            buttonWithInlineAsListener = (Button) findViewById(R.id.button_with_inline_class_as_listener);
            buttonWithInlineAsListener.setOnClickListener(new OnClickListener() {
    			public void onClick(View v) {
    				Toast.makeText(MainActivity.this, "Button with Inline Class as Listener has been clicked.", Toast.LENGTH_SHORT).show();
    			}
    		});
        }
     
        /** You implement this method after adding OnClickListener interface to your Activity. **/
    	public void onClick(View v) {
    		Toast.makeText(this, "Button with Activity as Listener has been clicked.", Toast.LENGTH_SHORT).show();
    	}
    	//
     
    	/** Name of the method and it's triggering comes from main.xml file.
             * Button's widget attribute android:onClick allows you to specify name of the method
             * which you have to implement. 
             * @throws IOException **/
    	public void onButtonClick(View v) throws IOException {
        	  Toast.makeText(this, "efface le mur.", Toast.LENGTH_SHORT).show();
     
        	   String texte =clientSocket.call(imageName);
        	   Toast.makeText(this, texte, Toast.LENGTH_SHORT).show();
     
     
    	}
     
     
    	/** Inner Class to respond to OnClick events. **/
    	class InnerOnClickButtonListener implements OnClickListener {
    		public void onClick(View v) {
    			Toast.makeText(MainActivity.this, "Button with Inner Class as Listener has been clicked.", Toast.LENGTH_SHORT).show();
    		}
    	}
    }

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    CODE pour devenir une balise doit être entouré de [ et de ]
    Il y a un bouton de prévisualisation du message dans le doute.

    Quand tu as une exception copie l'ensemble de l'exception (avec la 'stack-trace') ici, ce sera plus simple pour t'aider, dans le "logcat" ça sera un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     java.net.socketexeption: socket failed EAcces (permission denied)
       at  xxxxxxxxxxxxxxxx (xxxxx.java:37)
       at  yyyyyyyyyyyyyy (yyyy.java:23)
     caused by ....
       at ....
    Bon... en l’occurrence c'est facile.... permission denied, ça veut dire que tu n'as pas le droit d'ouvrir le socket... donc je pense que tu as oublié d'activer l'accès "internet" dans les permissions de l'application (manifest).

    Tu ne commences pas par le truc le plus facile....

    Une fois que tu auras corrigé le truc, tu va avoir certainement une autre exception: NetworkOnMainThreadException, en bref, utilisation du réseau dans le thread principal. C'est interdit.
    Pourquoi ? L'ouverture d'une connexion prend de toute manière 4x le "ping", sur un serveur 'distant' cela peut donc durer plusieurs secondes pendant lesquelles l'application ne répond à plus rien (retour/home/...) Et je ne parle pas du cas ou le serveur de répond pas => timeout que tu ne spécifie pas d'ailleurs donc potentiellement attente infinie
    Donc pour éviter un joli "L'application xxxx ne répond pas voulez vous la fermer", Android lance un "NetworkOnMainThreadException" immédiatement.
    Les solutions ? AsyncTask, ou Thread...

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut Asynctask
    Merci effectivement, je suis tombé sur l'erreur NetworkOnMainThreadException

    J'essaie donc d'implémenter une Asynctask

    Voici mes deux class.
    j'ai une erreur que je ne comprend pas sur la ligne 25
    comm.getOutputStream().write(params.getBytes());
    Cannot invoke getBytes() on the array type String[]

    or dans mon code précédent il me semble bien que imageName etait de type String aussi

    class 1
    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
     
    package com.example.planar;
     
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
     
    import android.os.AsyncTask;
     
     
    public class ClientSocket extends AsyncTask <String, Void, String> {
     
    			    @Override
    			    protected String doInBackground(String... params) {
    			    //code socket précédent
     
    			    	Socket comm = null;
    			 	    InputStream is = null;
    			 	    String returnString = null;
     
    			 	    try
    			 	    {
    			 	      comm = new Socket("192.168.0.10", 7072);
    			 	      comm.getOutputStream().write(params.getBytes());
    			 	      is = comm.getInputStream();
    			 	      int c;
    			 	      while((c = is.read()) != -1)
    			 	      returnString+=c;
    			 	    }
     
    			 	    catch(Exception e)
     
    			 	    {
    			 	     returnString ="Exception " + e.toString();
    			 	    }
    			 	    finally
     
    			 	    {
    			 	      if (is!=null)
    			 	      is.close();
    			 	      if (comm!=null)
    			 	      comm.close();
    			 	    }
     
    			 	  return returnString ;
     
     
     
    			    }
    		}
    class 2
    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
    60
    61
    62
    63
    64
    65
    66
     
    package com.example.planar;
     
    import java.io.*;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
     
     
    public class MainActivity extends Activity implements OnClickListener {
     
    	private Button buttonWithActivityAsListener;
    	private Button buttonWithInnerClassAsListener;
    	private Button buttonWithInlineAsListener;
    	private String imageName ="image_delete -1 gui\n\n";
     
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            buttonWithActivityAsListener = (Button) findViewById(R.id.button_with_activity_as_listener);
            buttonWithActivityAsListener.setOnClickListener(this);
     
            buttonWithInnerClassAsListener = (Button) findViewById(R.id.button_with_inner_class_as_listener);
            buttonWithInnerClassAsListener.setOnClickListener(new InnerOnClickButtonListener());
     
            buttonWithInlineAsListener = (Button) findViewById(R.id.button_with_inline_class_as_listener);
            buttonWithInlineAsListener.setOnClickListener(new OnClickListener() {
    			public void onClick(View v) {
    				Toast.makeText(MainActivity.this, "Button with Inline Class as Listener has been clicked.", Toast.LENGTH_SHORT).show();
    			}
    		});
        }
     
        /** You implement this method after adding OnClickListener interface to your Activity. **/
    	public void onClick(View v) {
    		Toast.makeText(this, "Button with Activity as Listener has been clicked.", Toast.LENGTH_SHORT).show();
    	}
    	//
     
    	/** Name of the method and it's triggering comes from main.xml file.
             * Button's widget attribute android:onClick allows you to specify name of the method
             * which you have to implement. 
             * @throws IOException **/
     
     
    	public void onButtonClick(View v) throws IOException {
        	  Toast.makeText(this, "efface le mur.", Toast.LENGTH_SHORT).show();
     
        	  new ClientSocket().execute(imageName);
        	 // Toast.makeText(this, texte, Toast.LENGTH_SHORT).show();
     
    	}
     
     
    	/** Inner Class to respond to OnClick events. **/
    	class InnerOnClickButtonListener implements OnClickListener {
    		public void onClick(View v) {
    			Toast.makeText(MainActivity.this, "Button with Inner Class as Listener has been clicked.", Toast.LENGTH_SHORT).show();
    		}
    	}
    }

  10. #10
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Voici pour corriger ton problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comm.getOutputStream().write(params[0].getBytes());
    Params est un tableau de Strings, donc tu récupères son premier éléments ensuite sur cet éléments, ensuite tu peux récupérer les données de cette string.

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut socket ne se ferme pas
    merci,
    en corrigeant la class socket avec param[0] et en suivant les corrections proposées par eclipse sur la gestion d'erreurs auquel je ne comprend rien :-)

    j'ai eu la joie de voir passer mon texte sur le socket lorsque j'appuie sur le bouton une première fois et effectivement c'est beaucoup plus long que des implémentations de socket que j'avais réalisé en Javascript/PHP

    Par contre après l'appuie sur le bouton une première fois le Socket reste ouvert et l'appuie sur le bouton ne donne plus rien. Avez vous une piste?

    Dernière question , param étant un array, je pourrais passer en paramètre le texte a envoyer mais aussi l'ip et le port? params[0]; params[1]; params[2]

    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
    60
    61
     
    package com.example.planar;
     
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
     
    import android.os.AsyncTask;
     
     
    public class ClientSocket extends AsyncTask <String, Void, String> {
     
    			    @Override
    			    protected String doInBackground(String... params) {
     
    			    	Socket comm = null;
    			 	    InputStream is = null;
    			 	    String returnString = null;
     
    			 	    try
    			 	    {
    			 	      comm = new Socket("192.168.0.10", 7072);
    			 	      comm.getOutputStream().write(params[0].getBytes());
    			 	      is = comm.getInputStream();
    			 	      int c;
    			 	      while((c = is.read()) != -1)
    			 	      returnString+=c;
     
    			 	    }
     
    			 	    catch(Exception e)
     
    			 	    {
    			 	     returnString ="Exception " + e.toString();
    			 	    }
    			 	    finally
     
    			 	    {
    			 	      if (is!=null)
    						try {
    							is.close();
    						} catch (IOException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						}
    			 	      if (comm!=null)
    						try {
    							comm.close();
    						} catch (IOException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    			 	    }
     
    			 	  return returnString ;
     
     
     
    			    }
    		}

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Remplace les e.printStackTrace() par un joli "Log.e("MONTAGAMOI","Erreur de fermeture de xxxx",e); " et tu auras peut être plus d'information....

    Maintenant, j'aimera voir le code appelant, parceque l'AsyncTask est démarré, mais je ne vois aucun appel à l'UI pour dire que la tache est finie....

    En général, pour ce genre de truc on a une classe "AsyncTask" locale à l'activité...
    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
     
    class TotoActivity extends Activity
    {
        ...
     
        class TotoSocketTask extends AsyncTask
        {
            @Override
            public void onPostExecute(String result)
            {
                 TotoActivity.this.onSocketResult(result);
            }
     
            ... <= le code que tu as
        }
     
     
        public void onStartSocket()
        {
             socketButton.disable();  // <= attention pseudo code
             new TotoSocketTask(...).execute();
        }
     
        public void onSocketResult(String res)
        {
             resultView.setText(res);
             socketButton.enable();  // <= attention pseudo code
        }
    }
    A la place de button enable/disable on fait souvent appel à une progress dialog (histoire de montrer à l'utilisateur qu'on fait quelque chose).


    Je subodore un truc genre:
    while((c = is.read()) != -1) qui retourne jamais...

    D'ailleurs returnString += c va planter.... returnString étant null...

    D'abord 'c' n'est pas un 'char' mais un int... donc le code va faire: returnString += Integer.toString(c); pas sur que ce soit le but.
    l'int en question est en fait un unsigned byte.... ce que le rend difficile à traduire en "byte"...
    Et même si c'était le cas, byte != char ... puisque un char nécessite 2 bytes en java

    De deux choses l'une, ou IOUtils est dispo sur Android (a vrai dire je n'ai pas accès au SDK là maintenant), et dans ce cas c'est facile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte[] bytes = IOUtils.toByteArray(is);
    String returnString = new String(bytes,CHARSET);
    Ou il ne l'est pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int nRead;
    byte[] data = new byte[BUFFER_SIZE];
    while ((nRead = is.read(data, 0, data.length)) != -1) 
      buffer.write(data, 0, nRead);
    buffer.flush();
    String returnString = new String(buffer.toByteArray(),CHARSET);

  13. #13
    Membre habitué
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Par défaut code qui marche
    Merci a tous

    voici le code qui fonctionne (sans doute encore du nettoyage a faire)

    Class lancant le socket et recevant 3 paramètres l'ip , le port , et le texte a envoyer
    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
    60
     
    package com.example.planar;
     
     
    import java.io.IOException;
    import java.net.Socket;
    import android.os.AsyncTask;
     
    public class ClientSocket extends AsyncTask <String, Void, String> {
     
    			    @Override
    			    protected String doInBackground(String... params) {
     
    			    	Socket comm = null;
    			 	   // InputStream is = null;
    			 	   String returnString = null;
     
    			 	    // recupere la chaine du port a utiliser et la trasnforme en int
    			 	    int port = Integer.parseInt(params[1]);
     
    			 	    try
    			 	    {
    			 	      comm = new Socket(params[0], port);
    			 	      comm.getOutputStream().write(params[2].getBytes());
    			 	     // is = comm.getInputStream();
    			 	     // int c;
    			 	     // while((c = is.read()) != -1)
    			 	    //  returnString+=c;
     
    			 	    }
     
    			 	    catch(Exception e)
     
    			 	    {
    			 	     returnString ="Exception " + e.toString();
    			 	    }
    			 	    finally
     
    			 	    {
    			 	      //if (is!=null)
    						//try {
    						//	is.close();
    						//} catch (IOException e1) {
    							// TODO Auto-generated catch block
    							//Log.e("MONTAGAMOI1","Erreur de fermeture de xxxx1",e1);
    						//}
    			 	      if (comm!=null)
    						try {
    							comm.close();
    						} catch (IOException e) {
    							// TODO Auto-generated catch block
    						}
    			 	    }
     
    			 	  return returnString ;
     
     
     
    			    }
    		}
    Et la main activity
    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
     
    package com.example.planar;
     
    import java.io.*;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
     
     
    public class MainActivity extends Activity  {
     
    	private String ipPcControl ="192.168.1.11";
    	private String port7001PcControl ="7001";
    	private String portSynlinkPcControl ="7072";
    	//private String portPliPcControl ="7001";
    	private String imageDelete ="image_delete -1 gui\n\n";
    	private String loadConfig1 ="send_message -dest indisys_director -msg {load_config preset_1}";
    	private String loadConfig2 ="send_message -dest indisys_director -msg {load_config preset_2}";
    	private String loadConfig3 ="send_message -dest indisys_director -msg {load_config preset_3}\n\n";
    	private String loadConfig4 ="send_message -dest indisys_director -msg {load_config preset_4}\n\n";
     
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           }
     
        // button  
    	/** Name of the method and it's triggering comes from main.xml file.
             * Button's widget attribute android:onClick allows you to specify name of the method
             * which you have to implement. 
             * @throws IOException **/
     
     
    	public void onButtonClick(View v) throws IOException {
        	  new ClientSocket().execute(ipPcControl,portSynlinkPcControl,imageDelete);
     	}
     
    	public void onButtonClick2(View v) throws IOException {
       	  new ClientSocket().execute(ipPcControl,port7001PcControl,loadConfig1);
    	}
     
    	public void onButtonClick3(View v) throws IOException {
    	   	  new ClientSocket().execute(ipPcControl,port7001PcControl,loadConfig2);
    		}
     
    	public void onButtonClick4(View v) throws IOException {
    	   	  new ClientSocket().execute(ipPcControl,port7001PcControl,loadConfig3);
    		}
     
    	public void onButtonClick5(View v) throws IOException {
    	   	  new ClientSocket().execute(ipPcControl,port7001PcControl,loadConfig4);
    		}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/10/2008, 19h47
  2. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  3. Pop-up d'une dialog box a partir d'un bouton
    Par bobbyjack dans le forum MFC
    Réponses: 21
    Dernier message: 13/09/2005, 15h32
  4. Afficher/Masquer un bouton comme IE 6
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/07/2002, 13h12
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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