Connexion au serveur pc depuis une application Android [Résolu]

Maximus - 11 avril 2016 à 19:15 - Dernière réponse : Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention
- 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.
Afficher la suite 

13 réponses

Répondre au sujet
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 12 avril 2016 à 09:59
+1
Utile
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");


Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Twinuts
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 15 avril 2016 à 09:47
+1
Utile
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));
?>

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Twinuts
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 12 avril 2016 à 08:50
0
Utile
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 ?
Commenter la réponse de Twinuts
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 12 avril 2016 à 09:40
0
Utile
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

Commenter la réponse de Cresus100
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 12 avril 2016 à 10:26
0
Utile
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.
Commenter la réponse de Cresus100
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 12 avril 2016 à 13:08
0
Utile
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...)
Commenter la réponse de Twinuts
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 13 avril 2016 à 23:51
0
Utile
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
Commenter la réponse de Cresus100
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 14 avril 2016 à 12:48
0
Utile
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.
Commenter la réponse de Twinuts
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 14 avril 2016 à 14:03
0
Utile
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());
Commenter la réponse de Cresus100
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 14 avril 2016 à 15:12
0
Utile
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()?
Commenter la réponse de Twinuts
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 14 avril 2016 à 18:42
0
Utile
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
Commenter la réponse de Cresus100
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 15 avril 2016 à 00:22
0
Utile
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);
Commenter la réponse de Cresus100
Cresus100 7 Messages postés mardi 12 avril 2016Date d'inscription 15 avril 2016 Dernière intervention - 15 avril 2016 à 17:10
0
Utile
Coucou,

J'ai testé ton code et ca marche.

Infiniment merci.
Commenter la réponse de Cresus100

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.