Créer un client TCP en Java
Objectif : Créer une classe client TCP permettant de communiquer avec le serveur TCP minimal sous Linux.
Téléchargez Eclipse.
Créer la classe ClientTcp
Documentation : API Java
- la classe
Socket
permet de créer une socket de communication TCP.- Le constructeur
Socket(String host, int port)
crée la socket et la connecte au serveurhost
écoutant les requêtes sur le portport
. - La méthode
getOutputStream()
permet d'obtenir un flux de sortie sur la socket permet d'effectuer une émission. - La méthode
getInputStream()
permet d'obtenir un flux d'entrée sur la socket permet d'effectuer une réception.
- Le constructeur
- Les classes
InputStream
etOutputStream
permettent d'utiliser, respectivement, un flux d'entrée et un flux de sortie.- La méthode
write(byte[] b)
permet d'écrireb.length
sur un flux de sortie. Le message est réellement émis lorsque la méthodeflush()
est appelée. - La méthode
read(byte[] b)
permet de lire des octets sur un flux d'entrée. - La méthode
close()
permet de fermer un flux.
- La méthode
- la classe
ByteBuffer
permet de construire un tableau d'octets dans lequel on peut stocker des données de types différents.- La méthode
ByteBuffer allocate(int capacity)
permet d'allouer l'emplacement nécessaire à ce tableau d'octets. - La méthode
byte[] array()
retourne le tableau debyte
- L'ensemble des méthodes
put...()
stockent la valeur passée en paramètre, dans le tableau d'octets, à la position courante. - L'ensemble des méthodes
get...()
transfèrent la valeur passée en paramètre, dans le tableau d'octets, depuis la position courante..
- La méthode
Le code de la classe ClientTcp
:
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.nio.ByteBuffer; public class ClientTcp { private Socket socketClient = null; private InputStream lecteur = null; private OutputStream ecrivain = null; public ClientTcp(String nomServeur, int portServeur) throws IOException { socketClient = new Socket(nomServeur, portServeur); ecrivain = socketClient.getOutputStream(); lecteur = socketClient.getInputStream(); } public void finalize() throws IOException{ lecteur.close(); ecrivain.close(); socketClient.close(); } public void emettre(ByteBuffer requete) throws IOException { ecrivain.write(requete.array()); ecrivain.flush(); } public void recevoir(ByteBuffer reponse) throws IOException { lecteur.read(reponse.array()); } }
Ecrire le programme de test de la classe ClientTcp
Je transmets la requête a
au serveur qui retourne le caractère suivant ou !
en cas d'erreur.
package clientTCP; import java.io.IOException; import java.nio.ByteBuffer; public class TestClientTcp { public static void main(String[] args) { int port = 50000; // Créer les zones mémoires pour la requête et la réponse ByteBuffer bufferRequete = ByteBuffer.allocate(1); ByteBuffer bufferReponse = ByteBuffer.allocate(1); try { // Effectuer la connexion ClientTcp clientTcp = new ClientTcp("192.168.1.101", port); // Créer la requête byte requete = (char)'a'; bufferRequete.put(requete); System.out.println("Requete du client : " + (char)requete); // Emettre la requete clientTcp.emettre(bufferRequete); // Recevoir la réponse clientTcp.recevoir(bufferReponse); // Afficher le résultat System.out.println("Reponse du serveur : " + (char)bufferReponse.get()); } catch (IOException e) { System.err.println("Echec de la communication réseau : " + e.getMessage()); } } }
Résultats d'exécution :
Requete du client : a Reponse du serveur : b
Si le serveur n'est pas démarré :
Echec de la communication réseau : Connection refused: connect