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 :

Réceptions Messages Socket


Sujet :

API standards et tierces Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut Réceptions Messages Socket
    Salut,

    Je programme actuellement sous Android, et mon application doit communiquer avec un programme en C++.
    Cette communication comprend un échange de données. Je gère bien (enfin je crois ^^) l'envoi d'infos, mais en ce qui concerne la réception, c'est la galère totale.

    Si quelqu'un pouvait m'aider, je lui en serai reconnaissant.

    Voici le code concerné :
    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
    public class IdentificationActivity extends Activity implements OnClickListener {
    	Button buttonValider = null;
    	EditText editNom;
    	EditText editPass;
    	private String nom;
    	private String pass;
    	private String reponseConnection;
    	private boolean connected = false;
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.identification);
     
     
    		editNom = (EditText)findViewById(R.id.editTextNom);
    		editPass = (EditText)findViewById(R.id.editTextPass);
    		buttonValider = (Button)findViewById(R.id.buttonValidIdent);
    		buttonValider.setOnClickListener(this);
     
    	}
    	@Override
    	public void onClick(View v) {	// click sur le bouton valider de l'ihm de creation
    		// TODO Auto-generated method stub
     
    		if(v == buttonValider) {
    			nom = editNom.getText().toString();
    			pass = editPass.getText().toString();
    			Thread cThread = new Thread(new ClientThread());
    			cThread.start();
     
    			if(reponseConnection == "OK") {
    				Intent monIntent = new Intent(this, ConfigurationActivity.class);
    				startActivity(monIntent);
    			}
    		}
     
    	}
     
    	public class ClientThread implements Runnable {
     
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
    			try {
    				Log.d("IdentificationActivity", "C: Connecting...");
    				Socket socket = new Socket("192.168.58.24", 1234);
    				connected = true;
    				if(connected) {
    					try {
    						Log.d("IdentificationAcitivity", "C: Sending Command");
    						PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    						BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    						out.println("IDENT,"+nom+","+pass);
    						out.flush();
    						Log.d("IdentificationActivity", "C: Sent");
    						reponseConnection = rd.readLine();
    					}
    					catch(Exception e) {
    						Log.e("IdentificationActivity", "S: Error", e);
    					}
    				}
    				socket.close();
    				Log.d("IdentificationAcitivty", "C: Closed");
    			}
    			catch(Exception e) {
    				Log.e("IdentificationActivity", "C: Error", e);
    				connected = false;
    			}
    		}
     
    	}
    }
    P.S. : C'est mon projet de BTS et cette communication est primordiale pour la suite.

  2. #2
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    Tu as quoi comme soucis ?

  3. #3
    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
    pour être propre il faut rajouter les "close" sur les resources...

    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Socket s = new Socket();
    boolean connected = f
    try {
        s.connect(...);
        connected = true;
    } catch (...) {
    } finally {
       if (connected)
          s.close();
    }
    Ensuite, je ne suis pas sur qu'il faille passer par un PrintStream...(quel charset/end-of-line sera utilisé ?)... L'output-stream devrait être suffisant (et plus simple à gérer coté serveur)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static String CHARSET = "UTF-8";
    static byte[] EOL = { '\n' };
     
    BufferedOutputStream bos = new BufferedOutputStream (s.getOutputStream());
    bos.write(login.getBytes(CHARSET));
    bos.write(EOL);
    bos.write(password.getBytes(CHARSET));
    bos.write(EOL);
    bos.flush();
    Apres pour le reste, comme on ne sait pas le probleme que tu as....

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Alors le code que j'ai posté est celui du client qui sera sur une tablette Android. Le serveur est en C++ sur un pc embarqué.
    Le problème que j'ai, c'est que lorsque j'envoie une trame de communication vers le serveur, celui-ci reçois correctement, mais quand il m'envoie la réponse disant qu'il a bien reçu le message, je ne reçois rien de mon côté.

    Sur un site, j'ai trouvé un sujet de tp qui est grosso-modo la chose que je dois faire :
    Envoyer votre identifiant et votre mot de passe au serveur, puis lire la réponse du serveur. Si l'identifiant et le mot de passe sont acceptés, afficher l'interface de configuration.

    EDIT : J'ai modifié mon code suite à quelques petites modifications d'envoi.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Bon j'ai réussi à régler le problème de la réception. Mais autre chose se présente : lors de la réception de cette réponse, si c'est "OK", je dois afficher une interface.
    Je suis passé en mode debug pour vérifier si je passe bien dans ma boucle. Je passe bien dedans mais l'interface ne s'affiche pas.

    Voici le code en question :
    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
    public class IdentificationActivity extends Activity implements OnClickListener {
    	Button buttonValider = null;
    	EditText editNom;
    	EditText editPass;
    	private String nom;
    	private String pass;
    	private String reponseConnection;
    	private boolean connected = false;
    	private boolean reponseLue = false;
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.identification);
     
     
    		editNom = (EditText)findViewById(R.id.editTextNom);
    		editPass = (EditText)findViewById(R.id.editTextPass);
    		buttonValider = (Button)findViewById(R.id.buttonValidIdent);
    		buttonValider.setOnClickListener(this);
     
    	}
    	@Override
    	synchronized public void onClick(View v) {	// click sur le bouton valider de l'ihm de creation
    		// TODO Auto-generated method stub
     
    		if(v == buttonValider) {
    			nom = editNom.getText().toString();
    			pass = editPass.getText().toString();
    			Thread cThread = new Thread(new ClientThread());
    			cThread.start();
    			while(reponseLue == false) {
    				try {
    					wait();
    				}
    				catch(InterruptedException ie) {
    					ie.printStackTrace();
    				}
    			}
    			if(reponseConnection.equals("OK")) {
    				Intent monIntent = new Intent(this, ConfigurationActivity.class);
    				startActivity(monIntent);
    			}
    		}
     
    	}
     
    	public class ClientThread implements Runnable {
     
    		@Override
    		synchronized public void run() {
    			// TODO Auto-generated method stub
    			try {
    				Log.d("IdentificationActivity", "C: Connecting...");
    				Socket socket = new Socket("192.168.58.22", 1234);
    				connected = true;
    				if(connected) {
    					try {
    						Log.d("IdentificationAcitivity", "C: Sending Command");
    						PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    						BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    						out.println("IDENT,"+nom+","+pass);
    						out.flush();
    						Log.d("IdentificationActivity", "C: Sent");
    						reponseConnection = rd.readLine();
    						reponseLue = true;
    						notify();
    					}
    					catch(Exception e) {
    						Log.e("IdentificationActivity", "S: Error", e);
    					}
    				}
    				socket.close();
    				Log.d("IdentificationAcitivty", "C: Closed");
    			}
    			catch(Exception e) {
    				Log.e("IdentificationActivity", "C: Error", e);
    				connected = false;
    			}
    		}
     
    	}
    }

  6. #6
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    Il faut lancer ton intent à partir de ton UI-Thread.
    regarde du coté des handler pour notifier ton thread principal

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Alors pour lancer le intent, si je dois le faire dans la méthode onCreate( ), cela ne va pas marcher, j'ai déjà essayer. A moins que tu puisses me donner un exemple avec le code que j'ai fourni.
    Quand à l'utilisation des handler pour notifier le thread principal, je ne vois pas du tout comment faire.

  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
    Un handler est un gestionnaire de messages qui seront traités dans le thread principal... Le thread principal étant le seul à pouvoir modifier l'UI.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Handler hdl = new Handler();
    ClientThread ct = new ClientThread(hdl);
    new Thread(ct).start();
    ...
     
    dans ClientThread:
    ...
    this.handler.post(new Runnable()) {
         onResponseReceive();
    }
    Parceque ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    			Thread cThread = new Thread(new ClientThread());
    			cThread.start();
    			while(reponseLue == false) {
    				try {
    					wait();
    				}
    				catch(InterruptedException ie) {
    					ie.printStackTrace();
    				}
    			}
    Ca annule tous les bénéfices d'utilisatation d'un thread !!!
    Autant tout faire dans le même thread hein !

    Sinon, une autre solution est l'utilisation des AsyncTask...

    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
     
    onCreate()
    {
        ClientTask ct = new ClientTask(...);
        ct.execute();
    }
     
    onResponse(...)
    {
        ... handle the response from task ....
    }
     
    static class ClientTask extends AsyncTask<...>
    {
         public Response doInBackground()
         {
              ... ce que fait le ClientThread maintenant...
         }
         public void onPostExecute(Response r)
         {
              Activity.this.onResponse(r); // <= sera appelé dans le thread UI !
         }
    }

Discussions similaires

  1. Réception messages pop.yahoo.fr et orange.fr
    Par Phil_LejDev dans le forum Thunderbird
    Réponses: 1
    Dernier message: 11/11/2008, 21h18
  2. problème réception messages
    Par nadine64 dans le forum Thunderbird
    Réponses: 1
    Dernier message: 01/08/2008, 08h59
  3. Réponses: 1
    Dernier message: 19/06/2008, 15h25
  4. Problème de réception dans Socket.
    Par rzayani dans le forum C++
    Réponses: 0
    Dernier message: 29/04/2008, 15h49
  5. [07]boite de réception ( message )
    Par crousty dans le forum Outlook
    Réponses: 13
    Dernier message: 17/04/2007, 23h03

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