Vous êtes sur la page 1sur 28

PROGRAMMATION

RÉSEAU: CODE SOURCE

Joseph NDONG
Faculté des Sciences et Techniques
Département de Mathématiques et Informatique
Joseph NDONG UCAD DAKAR
SENEGAL 1
PLAN DU COURS

Je donne ici des exemples de code pour l’utilisation des


Sockets en version multithréadé et RMI.

Joseph NDONG UCAD DAKAR


SENEGAL 2
Exemple multiutilisateurs de Socket Serveur TCP

package thread.serveur;

import java.io.*;
import java.net.*;
//Cette classe multithreadré sert a traiter plusieur requetes clients a la fois
public class TCPserver extends Thread{
protected BufferedReader in;
protected PrintWriter pw;
private Socket soc;
String s;
/**cree un socket d’ecoute pour chaque client qui se connecte et on
initialise les deux fux d'I/O*/
public TCPserver (Socket soc) {

3
try {
this.soc = soc;
this.in = new BufferedReader
(new InputStreamReader(this.soc.getInputStream()));
this.pw= new PrintWriter (this.soc.getOutputStream(), true);
}
catch (Exception e) {err.println ( "Pb lors de l'ecoute"); }
}
/*lance le traitement de la requete pour le client qui se connecte*/
public void run (){
try {
// tant que le client n'a pa envoye une chaine le traitement ne demarre pas
try {
traitement ();
Thread.sleep(1000);
}
catch (InterruptedException e){
err.println("Interruption grave du processus");
} Joseph NDONG UCAD DAKAR
SENEGAL 4
}
catch (Exception er){}
}
/*pour recuperer la requete du client c a d la chaine envoyee*/
public String reception(){
String d=null;
try {
d=in.readLine();
return d;
}
catch (Exception e){
err .println("Erreur reading ...") ;e.printStackTrace();
return null;
}
}

Joseph NDONG UCAD DAKAR


SENEGAL 5
/*pour le traitement proprement dit de la requete*/
public void traitement() {
try{
s = this.reception();
if (s==null) {out .println("Fin du service
avec"+soc.getRemoteSocketAddress()+ " Merci") ;soc.close() ;
}

else { out.println(s);
String revline=new StringBuffer(s).reverse().toString();
if (out != null)
pw.println("[Server Answer]>>> " + revline);
soc.close() ;//fermer a la fin du traitement
}

Joseph NDONG UCAD DAKAR


SENEGAL 6
catch (Exception e) { err .println ("Erreur traitement ...") ;
e.printStackTrace() ;}
}
/*Méthode principale*/
public static void main (String args [ ]) throws Exception{
java.net.ServerSocket ss=new java.net.ServerSocket (2000);
out.println("Demarrage serveur sur le port
"+ss.getLocalPort() + "....");
while (true) {
Socket s=ss.accept();
out.println("Traitement serveur...avec le
client"+s.getRemoteSocketAddress());

/*Lancement du programme serveur*/


new TCPserver(s).start();
}

}
} Joseph NDONG UCAD DAKAR
SENEGAL 7
Exemple multiutilisateurs de Client TCP

package thread.client;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class TCPClienThread extends Thread {
Socket s;
Scanner entree=null;
BufferedReader sin =null;
PrintWriter sout =null;
public TCPClienThread (){}
public void run(){
try {
String line;
while (true) {
s = new Socket("localhost",2000);
Thread.sleep(1000);

Joseph NDONG UCAD DAKAR


SENEGAL 8
out.println("Connected to " + s.getInetAddress() + " on port "
+ s.getPort());
sin = new BufferedReader
(new InputStreamReader(s.getInputStream()));
sout = new PrintWriter(s.getOutputStream(), true);
out.print("[Client Ask] > > >");
entree = new Scanner(System.in);
line = entree.nextLine();
if (line.equals(""))
{
s.close() ;
out.println("Client: je m arrete");
break;
}
else { sout.println(line);
sout.flush() ;
Joseph NDONG UCAD DAKAR
SENEGAL 9
line = sin.readLine();
out.println("recu du serveur: " + line);
}
}
}
catch (Exception dd){
out.println("probleme d'enfrmissement du Thread...");
}
finally{
try { // dans tous les cas on ecrase le socket, security impose
s.close();
}
catch (Exception er){}
}

}
public static void main (String[] args) {
// demarrage d’un client
new TCPClienThread ().start();
}
} 10
Exemple de mini serveur banquaire RMI

package rmibanque;
import java.rmi.RemoteException;
//interface distante
public interface Banque extends java.rmi.Remote {
public void creerCompte(String prenom, String nom, long numero, double solde,
double decouvert) throws RemoteException ;
public void retirer(long numero,double montant) throws RemoteException ;
public void deposer(long numero,double montant) throws RemoteException ;
public void imprimeHistorique(long numero) throws RemoteException ;
public double getDecouvert(long numero) throws RemoteException ;
public double getSolde(long numero) throws RemoteException ;
public long getNumero(long numero) throws RemoteException ;
// public Compte getCompteFromNumero(long numero) throws RemoteException ;
public boolean controlNumeroCompte(long numero) throws RemoteException ;
}

Joseph NDONG UCAD DAKAR


SENEGAL 11
La classe Compte est locale au serveur, les clients distants n’y ont pas accès,

package rmibanque;

public class Compte{


private String prenom,nom;
private double solde;
private double solde ;
private lonh numero;
HashMap<String, Compte> clients=new HashMap<> ( );
public Compte (long numerp,String prenom, String nom,int age, double solde){
this.numero=numero;
this.prenom=prenom;
this.nom=nom;
this.age=age;
this.solde=solde;
clients,put(numero+" ",this);
}
public void retirer (double m) { this.solde -=m;}
public void deposer (double m) {this.solde+=m;}
public double getSolde ( ) { return this.solde;}
Joseph NDONG UCAD DAKAR
} SENEGAL 12
Voici la classe de l’objet distant:
package rmibanque;

public class BanqueImpl extends java.rmi.server.UnicastRemoteObject


implements Banque,java.io.Serializable {

/*tous les clients seront en mémoire dans cette table*/


static java.util.Hashtable clients = new java.util.Hashtable ( );

public BanqueImpl (java.util.Hashtable clients) throws java.rmi.RemoteException {


super ( );
this.clients =clients;
}

Joseph NDONG UCAD DAKAR


SENEGAL 13
public Compte getCompteFromNumero(long numero){
Compte res = null;
java.util.Enumeration enu=BanqueImpl.clients.keys ( );
while (enu.hasMoreElements()){
Object cle = enu.nextElement();
long clenum=Long.parseLong(cle+"") ;
if (clenum = = numero)
{ res=(Compte)BanqueImpl.clients.get(cle);
break;
}
}
return res;

public static java.util.Hashtable initCompteClients ( ){

return clients;
}

Joseph NDONG UCAD DAKAR


SENEGAL 14
/**
*
* @param numero long le nuemro du nouveau compte a cree
* @return boolean si le numero existe deja boollean=false sinon boolean =true
*/
public boolean controlNumeroCompte(long numero){

/*ATTENTION: il ne faut pas faire la verif a partir de BDD, cela bloquerait le server
il faut plutot examiner les comptes disponibles dans le Hashtable.
En effet les methodes declarees dans l'objet distant ne doivent pas manipuler
JDBC(non serializable)*/
Compte cc=getCompteFromNumero(numero) ;
boolean b= false;
if (cc==null) b= true;
return b;
}

Joseph NDONG UCAD DAKAR


SENEGAL 15
/**
* Pour ouvrir un nouveau compte client et l'enregistrer dans la base de donnees
* @param prenom String
* @param nom String
* @param numero long
* @param solde double
* @param decouvert double
* @throws RemoteException
*/

public void creerCompte (String prenom,String nom,long numero,double solde,


double decouvert)
throws java.rmi.RemoteException
{
try{
new Compte(prenom, nom, numero, solde, decouvert);

}
catch (Exception e){}

}
Joseph NDONG UCAD DAKAR
SENEGAL 16
public void deposer (long numero,double montant)throws java.rmi.RemoteException {
Object d=clients.get(numero+"");
Compte c=(Compte)d;
try{
//au lieu de faire c.deposer(montant); il faut plutot lancer un thead synchonise
// avec l operation de retrait puis retrait et depot ne doivent en aucun
//cas se passer simultanement
ThreadCompteDepot td= new ThreadCompteDepot(c, numero, montant);
td.start();

}
catch (Exception cd) {}

Joseph NDONG UCAD DAKAR


SENEGAL 17
public void retirer(long numero,double montant){
try { Object d=clients.get(numero+"");
Compte c=(Compte)d;
try {
//au lieu de faire c.retirer(montant); il faut plutot lancer un thead synchonise
// avec l operation de depot puis retrait et depot ne doivent en aucun
//cas se passer simultanement
ThreadCompteRetrait tr= new ThreadCompteRetrait(c, numero, montant);
tr.start();
}
catch (Exception cd) {}
}
catch (Exception d){}
}

Joseph NDONG UCAD DAKAR


SENEGAL 18
public void imprimeHistorique(long numero) throws java.rmi.RemoteException {
Object d=clients.get(numero+"");
Compte c=(Compte)d;
c.imprimeHistorique();
}
public double getDecouvert(long numero) throws java.rmi.RemoteException {
Object d=clients.get(numero+"");
Compte c=(Compte)d;
double x= c.getDecouvert();
return x;
}
public double getSolde(long numero) throws java.rmi.RemoteException {
Object d=clients.get(numero+"");
Compte c=(Compte)d;
double k= c.getSolde();
return k;
}

Joseph NDONG UCAD DAKAR


SENEGAL 19
public long getNumero (long numero) throws java.rmi.RemoteException {
Object d=clients.get(numero+"");
Compte c=(Compte)d;
long k= c.getNumero() ;
return k;
}

Joseph NDONG UCAD DAKAR


SENEGAL 20
public static java.util.Hashtable getClientsFromBD(){
java.sql.Connection con= null; java.sql.Statement st=null;
java.sql.ResultSet rs1= null;
try {
ConnectBase.chargerDriver("org.gjt.mm.mysql.Driver");
}
catch (Exception f){out.println ( "Driver non charge"); }
try{
con=ConnectBase.creerConnexion("jdbc:mysql://localhost/employe","joseph","joe");

}
catch (Exception f){out.println("Connection impossible"); }
try {
st= ConnectBase.creerStatement(con);
rs1= st.executeQuery("select * from client") ;
if(rs1!=null)
while(rs1.next() ){
String o1=(String)rs1.getObject("prenom") ;
String o2=(String)rs1.getObject("nom") ;
long o3=Long.parseLong(rs1.getObject("numero")+"") ;
// double o4=Double.parseDouble(rs2.getObject("solde")+"") ;
// double o5=Double.parseDouble(rs2.getObject("decouvert")+"") ;
BanqueImpl.clients.put(o3+"",new Compte
Joseph NDONG UCAD(o1,o2,o3,0,0))
DAKAR ;
SENEGAL 21
}
}
catch (Exception f){out.println(" Error extrait clients BD "+f.getMessage() );
f.printStackTrace(); }

try{

rs1.close();
// rs2.close();
st.close() ;
con.close() ;

}
catch (Exception e){}
return BanqueImpl.initCompteClients();
}

Joseph NDONG UCAD DAKAR


SENEGAL 22
public static void enregClientBase(String prenom,String nom,long numero,
double solde, double decouvert) throws java.rmi.RemoteException {
java.sql.Connection con=null;
java.sql.Statement st=null;
try {
ConnectBase.chargerDriver("org.gjt.mm.mysql.Driver");
}
catch (Exception f){out.println("Driver non charge"); }
try{ java.net.InetAddress adr=java.net.InetAddress .getByName("joesden");
String adresse=adr.getHostAddress();
con=ConnectBase.creerConnexion("jdbc:mysql://localhost/employe","root","");

}
catch (Exception f){out.println("Connection impossible"); }
try{
st= ConnectBase.creerStatement(con);
st.executeUpdate("Insert into client VALUES ('"+prenom+"','"+nom+"','"+numero+"')") ;
st.executeUpdate("Insert into compte VALUES ('"+numero+"','"+solde+"','"+decouvert+"')")
;
}
Joseph NDONG UCAD DAKAR
SENEGAL 23
catch (Exception f){out.println (null,"Statement Error"); }

try{
st.close() ;
con.close() ;

}
catch (Exception e){}
}// fin de la methode enregClientBase

Joseph NDONG UCAD DAKAR


SENEGAL 24
public static void updateCompteClient(long numero,double solde)
throws java.rmi.RemoteException {
java.sql.Connection con=null;
java.sql.Statement st=null;
try{
ConnectBase.chargerDriver("org.gjt.mm.mysql.Driver");
}
catch(Exception f){out.println(null,"Driver non charge"); }
try{
con=ConnectBase.creerConnexion("jdbc:mysql://localhost/employe","root","");

}
catch(Exception f){out.println(null,"Connection impossible"); }
try{
st= ConnectBase.creerStatement(con);
st.executeUpdate("UPDATE compte SET solde='"+ solde+"'where numero='"+numero +"'");

}
catch(Exception f){out.println(null,"Statement Error"); }

Joseph NDONG UCAD DAKAR


SENEGAL 25
try{
st.close ( ) ;
con.close ( ) ;
}
catch(Exception e) { }
}// fin de la methode updateCompteClient

}// fin de la classe serveur

REMARQUE

Vous créerez la classe utilitaire ConnectBase qui gère l’accès à votre BD. Vous pouvez
aussi créer un exemple simple de client sous forme console ou sous forme GUI.

Joseph NDONG UCAD DAKAR


SENEGAL 26
Une classe principale pour démarrer le serveur bancaire:
package rmibanque;
public class ServerBank implements Runnable {
public void run ( ){
try{
out.println ("demarrage serveur banque ....");
java.util.Hashtable cl = BanqueImpl.initCompteClients();
BanqueImpl bi = new BanqueImpl (cl);
//java.net.InetAddress ad=java.net.InetAddress .getByName("joesden");
//String adhost=ad.getHostAddress();
// java.rmi.Naming.rebind("rmi://"+adhost+"/comptejoe", bi);
//java.rmi.Naming.rebind("rmi://192.168.0.252/comptejoe", bi);

java.rmi.Naming.rebind("rmi://localhost/comptejoe", bi);
out.println(" serveur banque demarre !!!");
}
catch (Exception er){err.println("Erreur serveur : "+er.getMessage() );
err.println("Erreur serveur STACK TRACE: " );er.printStackTrace() ;
}
}
Joseph NDONG UCAD DAKAR
SENEGAL 27
public void start(){
Thread t= new Thread (this);
t.start ( ) ;
}
public static void main(String[ ] args) throws java.rmi.RemoteException {
System.setSecurityManager (new RMISecurityManager ( )) ;
try{

ServerBank server = new ServerBank ( );


server.start ( ) ;

}
catch (Exception e){out.println("Erreur Thread : "+e.getMessage ( ) ); ;}
}

} // fin de la classe Main

Joseph NDONG UCAD DAKAR


SENEGAL 28

Vous aimerez peut-être aussi