ISTIC TP
Systèmes Répartis
TP 3: Socket UDP
Application 1: Calcul Factoriel
Ecrire une application Client/Serveur basée sur les Sockets UDP:
Le client envoie un entier vers le serveur.
Le serveur vérifie s’il s’agit bien d’un entier positif. Si c’est bien le cas, il fait le
calcul du factoriel et transmet le résultat vers le client. Sinon, il lui demande de
retransmettre un autre entier en envoyant la chaîne "Veuillez entrer un nombre
positif ! ".
Le client peut faire autant de tentatives jusqu’à l’envoi d’un nombre valide. A la
réception du résultat désiré, le client ferme le socket.
1ère Méthode : conversion entier -> String
import [Link];
import [Link];
import [Link];
import [Link];
public class Serveur {
public static void main(String[] args){
try{ InetAddress a=[Link]();
DatagramSocket se=new DatagramSocket();
DatagramSocket sr=new DatagramSocket(2021);
while(true) {
byte[] buffer=new byte[2];
DatagramPacket pr=new DatagramPacket(buffer,
[Link]);
[Link](pr);
String S= new String(buffer);
[Link]("entier reçu :"+S);
int n=[Link](S);
String be;
int f=1 ;
if(n>0)
{for(int i=1 ;i<=n ;i++)
{f=f*i;
}
be=[Link](f);
[Link]("résulat :"+f);
int l=[Link]();
byte[] b=new byte[l];
b=[Link]();
DatagramPacket pe=new DatagramPacket(b,[Link],a,2020);
Page 1
ISTIC TP
Systèmes Répartis
[Link](pe);
[Link]();
[Link]();
break ;
}
else
{
be="Veuillez entrer un nombre positif ! " ;
int l=[Link]();
byte[] b=new byte[l];
b=[Link]();
DatagramPacket pe=new DatagramPacket(b,[Link],a,2020);
[Link](pe);
}
}catch(IOException e) {}
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class Client {
public static void main(String[] args){
try{ InetAddress a=[Link]();
Scanner sc=new Scanner([Link]);
DatagramSocket se=new DatagramSocket();
DatagramSocket sr=new DatagramSocket(2020);
while(true) {
byte[] buffer=new byte[100];
DatagramPacket pr=new DatagramPacket(buffer, [Link]);
int n=[Link]();
String be=[Link](n);
int l=[Link]();
byte[] b=new byte[l];
b=[Link]();
DatagramPacket pe=new DatagramPacket(b,[Link],a,2021);
[Link](pe);
[Link](pr);
String S= new String(buffer);
if()
{
[Link](n+"!= "+S);
[Link]();
[Link]();
break;
}
[Link](S);
}
}catch(IOException e) {}
Page 2
ISTIC TP
Systèmes Répartis
2ème Méthode : conversion entier -> tableau de byte.
La première méthode nous impose d’envoyer un entier de taille deux caractères, sinon on aura
un disfonctionnement qu’on peut surmonter en utilisant les flux de tableau de bytes
ByteArray[Input/Output]Stream et les flux de types primitifs Java ( int, char, boolean, double,
long, byte, float, short) Data[Input/Output]Stream en suivant le même principe que la
conversion instance d’objet-> tableau de byte .
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class Serveur {
public static void main(String[] args){
try{ InetAddress a=[Link]();
DatagramSocket se=new DatagramSocket();
DatagramSocket sr=new DatagramSocket(2021);
while(true) {
byte[] buffer=new byte[100];
DatagramPacket pr=new DatagramPacket(buffer, [Link]);
[Link](pr);
ByteArrayInputStream bStream = new ByteArrayInputStream(buffer);
DataInputStream oo = new DataInputStream(bStream);
int n=[Link]();
[Link]();
double f=1 ;
if(n>0)
{for(int i=1 ;i<=n ;i++)
{f=f*i;
}
String s=f+"";
[Link]("résulat :"+f);
int l=[Link]();
byte[] b=new byte[l];
b=[Link]();
DatagramPacket pe=new DatagramPacket(b,[Link],a,2020);
[Link](pe);
[Link]();
[Link]();
break ;
}
else
{
String s="Veuillez entrer un nombre positif ! " ;
int l=[Link]();
byte[] b=new byte[l];
b=[Link]();
DatagramPacket pe=new DatagramPacket(b,[Link],a,2020);
Page 3
ISTIC TP
Systèmes Répartis
[Link](pe);
}
}catch(IOException e) {}
}
}
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class Client {
public static void main(String[] args){
try{ InetAddress a=[Link]();
Scanner sc=new Scanner([Link]);
DatagramSocket se=new DatagramSocket();
DatagramSocket sr=new DatagramSocket(2020);
while(true) {
byte[] buffer=new byte[100];
DatagramPacket pr=new DatagramPacket(buffer, [Link]);
int n=[Link]();
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
DataOutputStream oo = new DataOutputStream(bStream);
[Link](n);
[Link]();
byte[] b = [Link]();
DatagramPacket pe=new DatagramPacket(b,[Link],a,2021);
[Link](pe);
[Link](pr);
String S= new String(buffer);
if()
{
[Link](n+"!= "+S);
[Link]();
[Link]();
break;
}
[Link](S);
}
}catch(IOException e) {}
Page 4
ISTIC TP
Systèmes Répartis
Application 2: Socket UDP et Thread
Ecrire une application basée sur les sockets UDP permettant d’échanger des messages. Les
deux extrémités doivent être toujours prêtes à envoyer et recevoir des messages
indépendamment.
public class E1 {
public static void main(String [] args)
{
int portE=2020;
int portL =2021;
ThreadE e= new ThreadE (portE);
[Link]();
ThreadL l=new ThreadL(portL);
[Link]();}}
public class E2 {
public static void main(String [] args)
{
int portE=2021;
int portL =2020;
ThreadE e= new ThreadE (portE);
[Link]();
ThreadL l=new ThreadL(portL);
[Link]();}}
import [Link];
import [Link];
import [Link];
import [Link];
public class ThreadE extends Thread{
int p;
ThreadE(int port){p=port;}
public void run(){
Scanner sc=new Scanner ([Link]);
DatagramSocket ds;
try {
ds = new DatagramSocket();
while(true)
{String s=[Link]();
int l=[Link]();
byte[]B=new byte[l];
B=[Link]();
DatagramPacket dp=new DatagramPacket(B,l,[Link](),p);
[Link](dp);}
} catch (Exception e) {
[Link]();
Page 5
ISTIC TP
Systèmes Répartis
}}}
import [Link];
import [Link];
public class ThreadL extends Thread{
int p;
ThreadL(int port){p=port;}
public void run(){
DatagramSocket ds;
try {
ds = new DatagramSocket(p);
while(true)
{
byte[]b=new byte[100];
DatagramPacket dp=new DatagramPacket (b, [Link]);
[Link](dp);
String s= new String(b);
[Link](s);}
} catch (Exception e) {
[Link]();
}}}
Page 6