Connexion au serveur pc depuis une application Android

Résolu
Maximus - 11 avril 2016 à 19:15
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016 - 15 avril 2016 à 17:10
Bonjour,

J'essaie d'envoyer des données au serveur de mon pc depuis une application android mais j'y arrive pas.
J'ai essayé ce code

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost("http://10.188.171.170/gsc/reception.php");

...........

httpClient.execute(post);

Mais le httpClient.execute(post); ne fonctionne pas.

Pouvez vous m'aider svp.

13 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
12 avril 2016 à 09:59
Salut,

Ok je comprends mieux, c'est une erreur type, tu effectues un accès réseau dans le main thread ce qui est interdit sur Android.
Le log t'en informe (Caused by: android.os.NetworkOnMainThreadException)

Pour éviter ce problème le mieux serait d'utiliser une AsyncTask.

class HttpTask extends AsyncTask<String, Void, HttpResponse> {

    private Exception httpException = null;

    protected HttpResponse doInBackground(String... urls) {
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost post = new HttpPost(urls[0]);
            // ... code
            return httpClient.execute(post);
        } catch (Exception e) {
            httpException = e;
            return null;
        }
    }

    protected void onPostExecute(final HttpResponse response) {
        /* ici tu peux tester l'exception ainsi que la réponse */
    }
}


Pour l'exécution il suffit de mettre ça dans la méthode envoyerMessage:
new HttpTask().execute("http://10.188.171.170/gsc/reception.php");


1
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
15 avril 2016 à 09:47
Hello,

Après tests voici quelques changements (testé avec Android 6.0 et mon serveur php):

Fichier HttpGetTask.java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;

import android.app.Activity;
import android.os.AsyncTask;

@SuppressWarnings("deprecation")
public class HttpGetTask<T extends Activity & HttpGetTaskListener> extends
    AsyncTask<String, Void, JSONArray> {

  private final T t;

  public HttpGetTask(final T t) {
    this.t = t;
  }

  @Override
  protected JSONArray doInBackground(final String... uril) {
    JSONArray result = null;
    BufferedReader reader = null;
    final HttpClient client = new DefaultHttpClient();
    final HttpGet get = new HttpGet();

    try {
      final URI uri = new URI(uril[0]);
      get.setURI(uri);
      final HttpResponse response = client.execute(get);
      final StatusLine statusLine = response.getStatusLine();
      final int code = statusLine.getStatusCode();
      if (code == 200) {
        final StringBuilder sb = new StringBuilder();
        final HttpEntity entity = response.getEntity();
        final InputStream content = entity.getContent();
        reader = new BufferedReader(new InputStreamReader(content));
        String line;
        while ((line = reader.readLine()) != null)
          sb.append(line);
        result = new JSONArray(sb.toString());
      } else {
        throw new IOException("The server has responded an error " + code);
      }
    } catch (final Exception e) {
      t.runOnUiThread(new Runnable() {
        @Override
        public void run() {
          t.onTaskError(e);
        }
      });
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (final IOException e) {
        }
      }
    }
    return result;
  }

  @Override
  protected void onPostExecute(final JSONArray response) {
    try {
      for (int i = 0; i < response.length(); i++)
        t.onTaskResponse(response.getJSONObject(i).getString("message"));
      t.onTaskFinished();
    } catch (final Exception e) {
      t.onTaskError(e);
    }
  }
}


Aucun changement sur les autres fichiers.

Pour ce qui est du code PHP voici ce que j'ai utilisé:
<?php
$output = array();

for($i = 0; $i < 10; $i++) {
  $row["message"] = "test_$i";
  $output[] = $row;
}

header('Content-type: application/json');
exit(json_encode($output));
?>

1
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
12 avril 2016 à 08:50
Salut,

- Ton téléphone à bien accès au réseau de ton serveur ?
- Tu as bien renseigné les permissions android.permission.INTERNET dans ton manifest ?
- Le logcat de l'exécution te retourne quoi ?
0
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
12 avril 2016 à 09:40
Salut Twinuts c'est Maximus,

En fait, j'ai tester sur émulateur et sur mon telephone et ca ne marche pas. J'ai bien renseigner
<uses-permission android:name="android.permission.INTERNET"/>
dans le manifest. Voici mon code
 package com.example.gsctutandro;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	EditText edtMsg;
	Button btnEnvoyer;
	String resultat = null;
	InputStream is = null;
	StringBuilder sb = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        edtMsg = (EditText)findViewById(R.id.edtMsg);
        btnEnvoyer = (Button)findViewById(R.id.btnEnvoyer);
    }
    
    public void envoyerMessage(View v){
    	HttpClient httpClient = new DefaultHttpClient();
    	HttpPost post = new HttpPost("http://10.188.171.170/gsc/reception.php");
    	String msg = edtMsg.getText().toString();

    	if(msg.length() > 0){
    		try{
    			List<NameValuePair> donnees = new ArrayList<NameValuePair>(1);
    			donnees.add(new BasicNameValuePair("message", msg));
    			post.setEntity(new UrlEncodedFormEntity(donnees));
    			httpClient.execute(post);
    			
    			edtMsg.setText("");
    			Toast.makeText(this, "Message envoyé", Toast.LENGTH_SHORT).show();
    		}
    		catch(ClientProtocolException e){
    			e.printStackTrace();
    		}
    		catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    	else
    	    Toast.makeText(this, "Ce champ ne peut être vide", Toast.LENGTH_SHORT).show();
    }
}



Et voici en image ce que le LogCat m'affiche

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
12 avril 2016 à 10:26
Cool ca marche sur l'émulateur.
Mais comment est ce que je sais si mon téléphone à accès de mon serveur? Ca ne marche pas encore sur mon telephone.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
12 avril 2016 à 13:08
Si ton site web est sur ton réseau local il faut que ton tel soit en wifi pour être sur le même réseau que ton site, sinon si il est sur un réseau publique (hébergeur type ovh, 1&1, etc...) tu devrais pouvoir y avoir accès via le canal data de ton téléphone (2G, 3G, 4G etc...)
0
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
13 avril 2016 à 23:51
Coucou Twinuts,

J'ai encore besoin de ton aide. J'ai voulu faire l'opération contraire. Mais ca ne marche pas

Voici mes codes
J'ai créer une classe HttpGetTask
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;
import android.widget.Toast;

public class HttpGetTask extends AsyncTask<String, Void, HttpResponse>{

	@Override
	protected HttpResponse doInBackground(String... uril) {
		
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet();
		
		try{
			
			URI uri = new URI(uril[0]);
			get.setURI(uri);
		
			return client.execute(get);		
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
		
		
	}
	
	protected void onGetExecute(final HttpResponse response) {
	
	}


Et l'activité

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	Button btnRecuperer;
	TextView txtMessage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        btnRecuperer = (Button)findViewById(R.id.lblRecuperer);
        txtMessage = (TextView)findViewById(R.id.txtMessage);
    }
    
    public void recupererMessage(View v){
    	
    	HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet();
    	StringBuilder sb = new StringBuilder("");
    	BufferedReader br = null;
    	
    	try{
			
    		HttpResponse reponse = new HttpGetTask().execute("http://10.188.171.170/gsc/envoi.php").get();
    		InputStream is = reponse.getEntity().getContent();
    		br = new BufferedReader(new InputStreamReader(is));
		
    		String ligneLue = br.readLine();
		
			while(ligneLue != null){
				sb.append(ligneLue);
				sb.append("\n");
				
				ligneLue = br.readLine();
			}
    	}
    	catch(Exception e){
    		e.printStackTrace();
    	}
    	finally{
			if(br != null){
				try{
					br.close();
				}
				catch(IOException e){
					e.printStackTrace();
				}
			}
		}
    	
    	try{
    		JSONArray jArray = new JSONArray(sb.toString());
    		
    		for(int i = 0; i < jArray.length(); i++){
    			txtMessage.append(jArray.getJSONObject(i).getString("message"));
    			txtMessage.append("\n");
    		}
    	}catch(JSONException je){
    		je.printStackTrace();
    	}
    	
    }
}


Je serai vraiment ravi si tu pouvais m'aider. Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
14 avril 2016 à 12:48
Salut,

Avant toutes choses dans le sample que j'ai donné plus haut il y a une méthode onPostExecute ce nom n'a ABSOLUMENT rien à voir avec le fait que l'on utilise une requête POST ou GET, donc dans ta classe HttpGetTask il ne faut pas changer le nom en onGetExecute....

Après je pense que tu as loupé un truc concernant ta compréhension de la classe AsyncTask donc je te conseil de lire attentivement la documentation :).

Sinon (je ne peux pas tester le code donc dsl si il contient quelques erreurs):

Tu créer une petite interface pour faire la liaison entre l'Activity et la task
HttpGetTaskListener.java
public interface HttpGetTaskListener {

  public void onTaskResponse(final String text);
  
  public void onTaskError(final Throwable t);
  
  public void onTaskFinished();
  
}


Création de la task qui sera de type Activity implémentant l'interface HttpGetTaskListener
HttpGetTask.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;

import android.app.Activity;
import android.os.AsyncTask;

@SuppressWarnings("deprecation")
public class HttpGetTask<T extends Activity & HttpGetTaskListener> extends AsyncTask<String, Void, HttpResponse> {

  private final T t;

  public HttpGetTask(final T t) {
    this.t = t;
  }

  @Override
  protected HttpResponse doInBackground(final String... uril) {
    final HttpClient client = new DefaultHttpClient();
    final HttpGet get = new HttpGet();
    try {
      final URI uri = new URI(uril[0]);
      get.setURI(uri);
      return client.execute(get);
    } catch (final Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  @Override
  protected void onPostExecute(final HttpResponse response) {
    BufferedReader reader = null;
    try {

      final StatusLine statusLine = response.getStatusLine();
      final int code = statusLine.getStatusCode();
      if (code == 200) {
        final StringBuilder sb = new StringBuilder();
        final HttpEntity entity = response.getEntity();
        final InputStream content = entity.getContent();
        reader = new BufferedReader(new InputStreamReader(content));
        String line;
        while ((line = reader.readLine()) != null)
          sb.append(line);
       
        final JSONArray jArray = new JSONArray(sb.toString());
        t.runOnUiThread(new Runnable() {
          @Override
          public void run() {
            for (int i = 0; i < jArray.length(); i++) {
              try {
                t.onTaskResponse(jArray.getJSONObject(i).getString("message"));
              } catch (final JSONException e) {
                t.onTaskError(e);
                return;
              }
            }
            t.onTaskFinished();
          }
        });
      } else {
        throw new IOException("The server has responded an error " + code);
      }
    } catch (final Exception e) {
      t.runOnUiThread(new Runnable() {
        @Override
        public void run() {
          t.onTaskError(e);
        }
      });
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (final IOException e) { }
      }
    }
  }
}


Création de l'Activity
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements HttpGetTaskListener {

  Button   btnRecuperer;
  TextView txtMessage;

  @Override
  protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    btnRecuperer = (Button)findViewById(R.id.lblRecuperer);
    txtMessage = (TextView)findViewById(R.id.txtMessage);
  }

  public void recupererMessage(final View v) {
    /* veroullage du bouton pour eviter les task multiples */
    btnRecuperer.setEnabled(false);
    /* déclenchement de la requête */
    new HttpGetTask<MainActivity>(this)
        .execute("http://10.188.171.170/gsc/envoi.php");
  }

  @Override
  public void onTaskResponse(final String text) {
    txtMessage.append(text);
    txtMessage.append("\n");
  }

  @Override
  public void onTaskError(final Throwable t) {
    Log.e(getClass().getSimpleName(), "Exception: " + t.getMessage(), t);
    /* Restauration du bouton */
    btnRecuperer.setEnabled(true);
  }

  @Override
  public void onTaskFinished() {
    /* Restauration du bouton */
    btnRecuperer.setEnabled(true);
  }
}


Voilà normalement ça devrait être bon.
0
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
14 avril 2016 à 14:03
J'ai essayé le code que tu m'as conseillé. Mais j'ai une erreur au niveau de l'initialisation du JSONArray.



La ligne 1
package com.example.gsctutandror;


La ligne 64
final JSONArray jArray = new JSONArray(sb.toString());
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
14 avril 2016 à 15:12
Re,

C'est quoi le package blabla ? Si c'est dans le flux JSON ... Je ne pense pas que ce soit valide ...

Peux-tu afficher sb.toString()?
0
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
14 avril 2016 à 18:42
Désolé j'aurai du apporté cette précision. La ligne 1 c'est mon package.


Lorsque j'ai affiché
 sb.toString() 
il était vide
0
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
15 avril 2016 à 00:22
Ceci est le code php que j'utilise pour mon appli. Si ca peut aider.

$db = mysqli_connect('localhost', 'root', '');
	mysqli_select_db($db,'gsctuto');
	
	// Cette ligne permet d'effectuer notre requete
	$sql = mysqli_query($db,"SELECT message FROM information");
	
	// Recupérer les données dans un tableau
	while($resultat = mysqli_fetch_assoc($sql))
		$sortie[] = $resultat;
	
	
	// Encoder les données sous format JSON	
	$jsob = json_encode($sortie);
	
	print($jsob);
0
Cresus100 Messages postés 7 Date d'inscription mardi 12 avril 2016 Statut Membre Dernière intervention 15 avril 2016
15 avril 2016 à 17:10
Coucou,

J'ai testé ton code et ca marche.

Infiniment merci.
0
Rejoignez-nous