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
Socketpermet 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
InputStreametOutputStreampermettent d'utiliser, respectivement, un flux d'entrée et un flux de sortie.- La méthode
write(byte[] b)permet d'écrireb.lengthsur 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
ByteBufferpermet 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