Créer un client TCP sous Android
Documentation : developer.android.com : Connecting to the Network
Objectif : Créer une application client TCP permettant de communiquer avec le serveur TCP minimal sous Linux.
Une zone d'édition de texte (EditText) permettra de saisir la lettre à envoyer.
Un bouton (Button) appelé Emettre permettra d'émettre cette lettre au serveur.
Une zone de texte (TextView) permettra d'afficher la réponse du serveur.
Créez une application Android
Suivez la docucmentation pour créer votre application Android
Autoriser l'application à effectuer des communications réseaux
Il faut modifier le fichier app > manifests > AndroidManifest.xml en ajoutant les deux lignes ci-dessous à l'intérieur de la balise manifest :
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
android.permission.INTERNET: Autorise l'application à créer unesocketréseau.android.permission.ACCESS_NETWORK_STATE: Autorise l'application à accéder à des informations sur les réseaux.
Créer la classe client TCP
Créez la classe ClientTcp dans votre projet.
Utiliser une AsyncTask pour réaliser les opérations réseaux.
Documentation :
La classe AsyncTask permet de réaliser des communications réseaux en arrière plan et d'afficher les résultats dans l'IHM. En effet, il n'est pas
possible d'effectuer des communications réseaux dans le thread exécutant l'IHM. Les AsyncTasks doivent être utilisées pour des traitements courts (quelques secondes).
Il faut créer une classe dérivée de la classe AsyncTask et implanter les deux méthodes ci-dessous :
doInBackground(): cette méthode est exécutée en arrière plan dans un autrethreadque lethreadprincipal.onPostExecute(): cette méthode est exécutée aprèsdoInBackground(). Elle permet de mettre à jour l'IHM duthreadprincipal.
import android.os.AsyncTask;
import android.widget.TextView;
import java.io.IOException;
import java.nio.ByteBuffer;
public class ClientTcpMinimal extends AsyncTask<Integer,Integer,Integer> {
String adresse;
int port;
byte requete;
TextView textViewCaractereRecu;
final int LONGUEUR_REQUETE = 1;
final int LONGUEUR_REPONSE = 1;
ByteBuffer bufferRequete = ByteBuffer.allocate(LONGUEUR_REQUETE);
ByteBuffer bufferReponse = ByteBuffer.allocate(LONGUEUR_REPONSE);
ClientTcpMinimal(String adresse, int port, byte requete, TextView textViewCaractereRecu) {
this.adresse = adresse;
this.port = port;
this.requete = requete;
this.textViewCaractereRecu = textViewCaractereRecu;
}
protected Integer doInBackground(Integer... params) {
try {
ClientTcp clientTcp = new ClientTcp(adresse, port);
bufferRequete.put(requete);
clientTcp.emettre(bufferRequete);
clientTcp.recevoir(bufferReponse);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
byte[] tableauReponse = new byte[1];
tableauReponse[0] = bufferReponse.get();
textViewCaractereRecu.setText(new String(tableauReponse));
}
}
Créer l'interface
Résultat attendu :
Ecrire le code de la classe MainActivity
La méthode execute(), exécutée depuis le thread principal (IHM), permet d'appeler la méthode doInBackground() de la classe ClientTcpMinimal.
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText editTextCaractereAEmettre;
private TextView textViewCaractereRecu;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Associer les attributs avec les composants de l'IHM
editTextCaractereAEmettre = (EditText) findViewById(R.id.caractereAEmettre);
textViewCaractereRecu = (TextView) findViewById(R.id.caractereRecu);
}
/** Fonction appelée lorsqu'on clique sur le bouton emettre */
public void onClickBoutonEmettre(View view) {
byte requete;
char requeteChar = editTextCaractereAEmettre.getText().charAt(0);
requete = (byte)requeteChar;
ClientTcpMinimal clientTcpMinimal = new ClientTcpMinimal(new String("192.168.1.101"), 50000, requete, textViewCaractereRecu);
clientTcpMinimal.execute();
}
}
Exécuter l'application
Résultat obtenu :