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 :

Socket sous android le client ne se connecte pas au serveur


Sujet :

API standards et tierces Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut Socket sous android le client ne se connecte pas au serveur
    Bonjour,

    Voila, je développe une appli Android sur Eclipse et j'ai besoin de communiquer avec un serveur socket, j'arrive à lancer le serveur qui est une simple appli java mais lorsque je lance le client qui lui est une appli Android, celui-ci ne se connecte pas au serveur car j'envoie des messages des deux cotés et aucun n'est affiché, voici mon code, :

    serveurtest.java

    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
    public class serveurtest {
     
    	public static void main(String[] args){
    		Scanner sc = new Scanner(System.in);
    		int b = 0;
    		ServerSocket socketserver;
    		Socket socketduserveur ;
    		BufferedReader in = null ;
    		PrintWriter out;
    		String rep;
    	 try {
     
    	      socketserver = new ServerSocket(2009);	      
    	      InetAddress address = InetAddress.getLocalHost();
    	      String hostIP = address.getHostAddress() ;
    		  String hostName = address.getHostName();
    		  System.out.println( "Le nom de serveur est : " + hostName + "\nIP: " + hostIP);
    		  System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort());
    	      socketduserveur = socketserver.accept(); 
    		  System.out.println("client connecté");
    		  in = new BufferedReader(new InputStreamReader(socketduserveur.getInputStream()));
    		  out = new PrintWriter(socketduserveur.getOutputStream());
     
                      out.println("test");
     
    		  socketduserveur.close();
    	      socketserver.close();
     
    }
    	 catch (Exception e) {
    	      e.printStackTrace();
    	      System.out.println("erreur 1");
    	    }
    }
    }
    client.java

    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
     
    package com.example.client;
     
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
     
    import android.os.Bundle;
    import android.widget.RadioButton;
    import android.widget.TextView;
    import android.app.Activity;
     
     
     
    public class QCM extends Activity {
     
    	TextView tv;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
     
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.qcm);
     
    		Socket socket;
    		BufferedReader in;
    		PrintWriter out = null;
    		String b = "";
     
    		try {
     
    			socket = new Socket("10.10.24.119",2009);	//adresse IP du serveur 
    			in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    			out = new PrintWriter(socket.getOutputStream());
     
     
    			out.println("TEST");
    			b=in.readLine();   
     
    			tv = (TextView)findViewById(R.id.test);
    			tv.setText(b);
     
     
     
    		}catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}	
    	}
    }
    Il n'y a pas écrit "vous êtes connectés" dans la console donc j'imagine que le programme bloque au niveau de " socketduserveur = socketserver.accept(); "

    Merci de votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Par défaut
    Salut,

    T'es sur de ton IP ?
    Le port 2009 pourrait-il être bloqué par un firewall ?

  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
    1. Utilisation des sockets dans le "main" thread (onCreate !) => NetworkOnMainThreadException, c'est interdit... utiliser un service, un thread, ou... encore plus simple une AsyncTask.

    2. 10.10.24.119 est bien l'IP du serveur quand il démarre ?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut
    Merci pour vos réponses, le serveur.java affiche l'ip à cette ligne :

    System.out.println( "Le nom de serveur est : " + hostName + "\nIP: " + hostIP);

    et je mets celle qu'il m'affiche dans client.java donc théoriquement c'est la bonne ip.


    1. Utilisation des sockets dans le "main" thread (onCreate !) => NetworkOnMainThreadException, c'est interdit... utiliser un service, un thread, ou... encore plus simple une AsyncTask.
    J'ai créé un thread du coup mais je ne suis pas sur que l'on fait comme ça :

    CreerSocket.java
    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
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
     
    import android.os.Bundle;
    import android.widget.RadioButton;
    import android.widget.TextView;
    import android.app.Activity;
     
    public class CreerSocket extends Thread{
     
    	TextView tv;
     
     
    	public void run(){
    		Socket socket;
    		BufferedReader in;
    		PrintWriter out = null;
    		String b = "";
     
    		try {
     
    			socket = new Socket("192.168.0.11",2009);	//adresse IP du serveur 
    			in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    			out = new PrintWriter(socket.getOutputStream());
     
     
    			out.println("TEST");
    			b=in.readLine();   
    			tv = (TextView)findViewById(R.id.test);
    			tv.setText(b);
     
     
    		}catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}	
     
    	}
    }

    j'ai une erreur a la ligne de findViewById : The method findViewById(int) is undefined for the type CreerSocket
    je ne sais pas a quoi cela correspond !

  5. #5
    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
    Oui... tu mélanges l'interface et une classe de thread séparée (j'ai l'impression).

    Quand je disais de passer par AsyncTask, il y avait une raison !

    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
     
    class MonActivity ....
    {
     
     
     
         public void onCreate()
         {
              ...
     
              new ConnectionTask().execute();  // on démarre la tâche
         }
     
     
         // une classe "fille"
         class ConnectionTask extends AsyncTask<Void,Void,String>
         {
     
              public String doInBackground(Void...params)
              {
                   String ret = null;
                   BufferReader in;
                   PrintWriter out;
                   Socket socket;
     
                   try {
                       socket = new Socket("192.168.0.11",2009);	//adresse IP du serveur 
                       in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
                       out = new PrintWriter(socket.getOutputStream());
     
                       out.println("TEST");
                       ret = b.readLine();
                   } catch (Exception ex) {
                       // on utilise Log sous android !
                       Log.e("ConnectionTask","Failure !",ex);
                   } finally {
                       // il faut tout fermer hein !!!
                       if (out != null) out.close();
                       if (in != null) in.close();
                       socket.close();
                   }
                   return ret;
              }
     
              // ici on est à nouveau dans le thread "UI" on a donc le droit de modifier celle-ci
              public void onPostExecute(String result)
              {
                   if (result != null) {
                      TextView tv = (TextView) MonActivity.this.findViewById(R.id.test);
                      tv.setText(result);
                   }
              }
        }
    }

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Par défaut
    Merci Nicroman, j'ai corrigé quelques trucs, je n'ai plus d'erreur dans le code mais le client ne veut toujours pas se connecter, j'ai ouvert le port 2009 mais ce n'est pas ça le problème car le programme marchait très bien avant que je n'essaye de l'exporter sous android.

    j'ai modifié principalement la méthode doInBackground
    Mon code est le suivant :

    main.java
    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
    public class main extends Activity {
     
     
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
     
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.qcm);
     
    		new ConnectionTask().execute(); 
    	}
     
    	// ici on est à nouveau dans le thread "UI" on a donc le droit de modifier celle-ci
    	public void onPostExecute(String result)
    	{
    		if (result != null) {
    			TextView tv = (TextView) main.this.findViewById(R.id.test);
    			tv.setText(result);
    		}
    	}
     
    }
    ConnectionTask.java

    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
    class ConnectionTask extends AsyncTask<Void,Void,String>
    {
     
    	public String doInBackground(Void...params)
    	{
    		String ret = null;
    		BufferedReader in = null;
    		PrintWriter out = null;
    		Socket socket = null;
     
    		try {
    			socket = new Socket("127.0.0.1",2009);	//adresse IP du serveur 
    			in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    			out = new PrintWriter(socket.getOutputStream());
     
    			out.println("TEST");
    			ret = in.readLine();
    		} catch (Exception ex) {
    			// on utilise Log sous android !
    			Log.e("ConnectionTask","Failure !0",ex);
    		}finally {
    			// il faut tout fermer hein !!!
    			if (out != null) out.close();
    			if (in != null)
    				try {
    					in.close();
    				} catch (Exception ex1) {
    					Log.e("ConnectionTask","Failure !1",ex1);
    				}
    			try {
    				socket.close();
    			} catch (Exception ex2) {
    				Log.e("ConnectionTask","Failure !2",ex2);
    			}
    		}
    		return ret;
    	}
     
     
    }

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2015, 18h06
  2. Réponses: 3
    Dernier message: 30/08/2011, 09h24
  3. Développer un client XML-RPC sous Android
    Par randriano dans le forum Android
    Réponses: 10
    Dernier message: 05/08/2011, 08h25
  4. multi-user gaming (MUG) : Client XMPP sous android / serveur local openfire
    Par shessuky dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 31/03/2011, 16h15
  5. Réponses: 2
    Dernier message: 26/01/2008, 12h19

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