Ressources informatiques

Ressources informatiques

Ressources informatiques

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" />

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 :

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 :

Client TCP Android

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 :

Client TCP Android