Département d’Informatique Année d’étude: Master 1
Module : Programmation distribuée
Année universitaire : 2019/2020
TP2 : Les Sockets
Exercice 1.
1. Tester les exemples de base suivants sur une seule machine « localhost ». Lancer d’abord le serveur, puis le client : vous aurez deux fenêtres de sorties console sur lesquelles vous pouvez tester et voir si vos messages sur le côté client arrivent et s’affichent sur le serveur.
Attention : pour les deux cas de sockets TCP ou UDP, les ports de connexion côté client et côté serveur doivent être le même.
Exemple 1 : sockets UDP
// Code côté client import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ClientUDP {
public static void main(String args[]) throws IOException {
String hote = "localhost";
int port =1000, taille = 1024;
byte[] messageEnvoye = new byte[taille];
InetAddress serveur = InetAddress.getByName(hote);
System.out.println("Donner un message à transmettre");
Scanner sc = new Scanner(System.in);
messageEnvoye = sc.nextLine().getBytes();
sc.close();
DatagramSocket soc = new DatagramSocket();
DatagramPacket donneeEnvoye = new DatagramPacket(messageEnvoye, messageEnvoye.length, serveur,port);
soc.send(donneeEnvoye);
soc.close();
}
}
// Côté Serveur import java.io.*;
import java.net.*;
public class ServeurUDP {
public static void main(String args[]) throws IOException{
int port = 1000, taille = 1024;
byte buffer[] = new byte[taille];
String messageRecu;
DatagramSocket soc = new DatagramSocket(1000);
DatagramPacket donneeRecu = new DatagramPacket(buffer, buffer.length);
System.out.println("serveur active sur port " + port);
while (true) {
soc.receive(donneeRecu);
messageRecu = new String(buffer);
System.out.println("Le client est connecté, le message envoyé = " + messageRecu);
}
} }
Exemple 2: Sockets TCP
// Code côté client
import java.net.*;
import java.io.*;
public class Client {
public static void main(String args[]) throws IOException { String hote = "localhost", messageEnvoye;
int port =1000;
Socket soc = new Socket(hote,port);
OutputStream flux = soc.getOutputStream();
OutputStreamWriter sortie = new OutputStreamWriter(flux);
System.out.println("Donner un message à transmettre");
BufferedReader entreeDepuisUtilisateur =
new BufferedReader(new InputStreamReader(System.in));
messageEnvoye = entreeDepuisUtilisateur.readLine();
sortie.write(" "+ messageEnvoye);
sortie.flush(); // pour forcer l'envoi à la ligne
soc.close();
} }
// Côté Serveur
import java.io.*;
import java.net.*;
public class Serveur {
public static void main(String args[]) throws IOException{
int port = 1000;
ServerSocket sersoc = new ServerSocket(port);
System.out.println("serveur active sur port " + port);
while (true) {
Socket soc = sersoc.accept();
InputStream flux = soc.getInputStream();
BufferedReader entree = new BufferedReader(new
InputStreamReader(flux));
String message = entree.readLine();
System.out.println("message reçu sur le serveur = " + message);
} }
}
2. Tester les programmes précédents sur deux machines différentes connectés à un réseau local: une machine est « client » et une autre « serveur ».
Exercice 2.
L’objectif de cet exercice est de compter le nombre de clients qui se connectent sur un serveur. Le modèle de communication utilisé est les sockets TCP et le traitement coté serveur est réalisé à l’aide d’un thread.
Soient les deux codes suivants (Serveur.java et Client.java) :
import java.io.IOException;
import java.net.*;
public class Serveur {
public static void main(String[] args){
ServerSocket socket;
try {
socket = new ServerSocket(2011);
Thread t = new Thread(new Accepter_clients(socket));
t.start();
System.out.println("Mes clients sont prets ");
} catch (IOException e) {}
} }
class Accepter_clients implements Runnable { private ServerSocket socketserver;
private Socket socket;
private int nbrclient = 1;
public Accepter_clients(ServerSocket s){
socketserver = s;
}
public void run(){
try {
while(true){
socket = socketserver.accept(); // attente d'un client System.out.println("Le client numero "+nbrclient+ "
est connecte");
nbrclient++;
socket.close();
}
} catch (IOException e) {}
} }
import java.io.IOException;
import java.net.*;
public class Client {
public static void main(String[] args){
Socket socket;
try {
socket = new Socket("localhost",2011);
socket.close();
} catch (IOException e) {}
} }
Questions :
1. Lancez le serveur et lancez le client plusieurs fois.
2. Modifiez le code précédent afin de limiter le nombre de clients qui peuvent se connecter à 5.
Exercice 3.
L’objectif de cet exercice est de réaliser une application de tchatche, pour cela nous allons utiliser la bibliothèque swing et les sockets tcp. L’application est réalisée avec une seule classe qui représente à la fois le client est le serveur. Au lancement de l’application la fenêtre JFrame suivante est apparue (combinaison de JLabel, JTextField, JPanel, JTextArea, JRadioButton, …) :
Pour tchatcher il faut lancer deux instances de cette application, une instance pour la première personne qui doit choisir le bouton Serveur et une instance pour la deuxième personne qui doit choisir le bouton Client. A l’intérieur de l’application, on peut trouver un code qui ressemble au suivant :
if (Serveur) {
hostServer = new ServerSocket(port);
socket = hostServer.accept(); // attente client }
else { // si Client
socket = new Socket(“localhost”, port);
}