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 unesocket
ré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 autrethread
que lethread
principal.onPostExecute()
: cette méthode est exécutée aprèsdoInBackground()
. Elle permet de mettre à jour l'IHM duthread
principal.
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 :