TP 3 : la programmation réseau
A. Récupérer une adresse IP avec InetAddress
1. Ecrire le code suivant :
La classe InetAdress peut lever une exception de type UnknownHostException, tâchez de ne
pas l'oublier !
import java.net.*;
public class Adressage {
public static void main(String[] args) {
InetAddress LocaleAdresse ;
InetAddress ServeurAdresse;
try {
LocaleAdresse = InetAddress.getLocalHost();
System.out.println("L'adresse locale est : "+LocaleAdresse );
ServeurAdresse= InetAddress.getByName("www.google.com");
System.out.println("L'adresse du serveur google est :
"+ServeurAdresse);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
2. Quel est le rôle de la méthode getLocalHost ()?
3. Quel est le rôle de la méthode getByName () ?
4. Donner tous les méthodes de la classe InetAddress
5. Déduire l’adresse IP du serveur facebook
.
B. Les constructeurs du sockets TCP
Les constructeurs pour créer des serveurs :
1. ServerSocket socketserver = new ServerSocket (numero_port);
On obtient un objet de la classe ServerSocket sur un port spécifique : si ce dernier est à 0, le socket
est créé sur n'importe quel port libre.
2. ServerSocket socketserver = new ServerSocket(numer_port,nbr_max);
Deux paramètres, le premier est bien sûr le numéro de port et le nombre total de connexions
simultanées acceptées
3. ServerSocket socketserver = new ServerSocket(numer_port,nbr_max,adresse_locale);
Spécifier l'adresse locale du serveur
Les constructeurs pour créer des clients :
La création d'un socket pour un programme client s'effectue à l'aide d'un des constructeurs suivants :
1. Socket socket = new Socket(param1, param2)
Le premier paramètre correspond à l'identité du client, il peut être une chaine de caractère ou de type
InetAddress, param2 correspond au numéro de port sur lequel on souhaite se connecter sur le serveur.
2. Socket socket = new Socket(adresse_distante, port_distant, adresse_locale,
port_locale)
Après tentative de connexion, si tout va bien, le serveur accepte la connexion du client, et reçoit un
nouveau socket qui est directement lié au même port local.
Socket socketduserveur = socketserver.accept();
Une fois le socket créé, l'attente de connexion provenant du client se fait à l'aide de la méthode accept().
1. Ecrire le code suivant :
public class Serveur {
public static void main(String[] args) {
ServerSocket socketserver ;
Socket socketduserveur ;
try {
socketserver = new ServerSocket(2015);
socketduserveur = socketserver.accept();
System.out.println("C'est connecté au serveur !");
socketserver.close();
socketduserveur.close();
}catch (IOException e) {
}
}}
2. Déterminer les paramètres du socket serveurs créé
Soit la classe client suivante :
public class Client {
public static void main(String[] args) {
Socket socket;
try {
socket = new Socket(InetAddress.getLocalHost(),2015);
socket.close();
}catch (UnknownHostException e) {
e.printStackTrace();
}catch (IOException e) {
}
}
}
3. Exécuter la classe Serveur puis Client que se passe-t-il ?
C. Échange de message
Une fois la connexion établie et les sockets en possession, il est possible de récupérer le flux d'entrée et
de sortie de la connexion TCP vers le serveur. Il existe deux méthodes pour permettre la récupération
des flux :
getInputStream() de la classe InputStream. Elle nous permet de gérer les flux entrant ;
getOutputStream() de la classe OutputStream. Elle nous permet de gérer les flux sortant.
Ces deux méthodes nous permettent donc de gérer les flux en entrée et en sortie. En général le type
d'entrée et sortie utilisé est BufferedReader et InputStreamReader pour la lecture, PrintWriter pour
l'écriture. Mais on peut utiliser tous les autres flux.
1. Ecrire les deux classes suivantes :
import java.io.*;
import java.net.*;
public class ServeurEchange {
public static void main(String[] args) {
ServerSocket socketserver ;
Socket socketduserveur ;
BufferedReader in;
PrintWriter out;
try {
socketserver = new ServerSocket(2015);
System.out.println("Le serveur est à l'écoute du port
"+socketserver.getLocalPort());
socketduserveur = socketserver.accept();
System.out.println("Un client s'est connecté");
out = new PrintWriter(socketduserveur.getOutputStream());
out.println("Vous êtes connecté client à mon serveur !");
out.flush();
socketduserveur.close();
socketserver.close();
}catch (IOException e) {
}
}
}
import java.io.*;
import java.net.*;
public class ClientEchange {
public static void main(String[] args) {
Socket socket;
BufferedReader in;
PrintWriter out;
try {
socket = new Socket(InetAddress.getLocalHost(),2015);
System.out.println("Demande de connexion");
in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
String message_distant = in.readLine();
System.out.println(message_distant);
socket.close();
}catch (UnknownHostException e) {
e.printStackTrace();
}catch (IOException e) {
}
}
2. Lancer la classe ServeurEchange puis ClientEchange et expliquer les résultats obtenus
3. Supprimer le code out.flush(); et exécuter les deux classes Que remarquer vous ?
4. Modifier le code pour que le serveur envoi au client une chaine de caractères entrer par le
clavier