Вы находитесь на странице: 1из 5

Client/Serveur et Technologies WEB Chapitre 3 : Programmation Systme en Java

Master IT 2e anne Universit de Poitiers Ph. Meseure (Philippe.Meseure@univ-poitiers.fr)

Plan
!

Sommaire
!

La programmation systme en Java


" " "

les threads Les entres/sorties les sockets

Sources :
! ! !

JAVA in a Nutshell, OReilly Au cur de Java (tomes 1 & 2) Site officiel www.sun.com !

Principe
!

Thread=processus lger
! ! !

Programmation Systme en Java


!

processus = multiples flux d'excutions lger = partage d'un mme espace mmoire d'une application (les donnes sont partages) application est dite multithreade thread=instance d'une sous-classe de Thread Implantation obligatoire de la mthode run() contrle du thread avec les mthodes start(), sleep(), join(), getPriority(),setPriority()

Java gre en natif les threads


! ! !

Les threads

public class MonThread extends Thread { public void run() { // code excuter en parallle } }
3 4

Utilisation de la classe Thread


UnObjet:UneClasse new start() run unThread: MonThread

Interface Runnable
!

Autre solution plus souvent utilise


! ! !

classe implantant l'interface Runnable et possdant une mthode run() Cration d'un thread qui appelle la mthode run() de l'objet fourni en paramtre Partage des donnes facile !

public class UneClasse implements Runnable { public void run() {


// Utilisation des attributs et mthodes de UneClasse

} public static void main(String String[] args) { String UneClasse un_objet=new UneClasse(); UneClasse Thread t=new Thread(un_objet); Thread t.start(); /* La mthode run de un_objet est lance en parallle, on peut continuer d'utiliser un_objet pendant ce temps */ }
5

Gestion des conflits d'accs


!

La synchronisation
!

Programmation parallle ! protection des variables utiliss par les threads ! section critique=1 seul thread peut lire/crire sur l'objet ! verrou sur un objet pour empcher les accs concurrents En Java, utilisation de synchronized
public class UneClasse implements Runnable { public synchronized void uneMethodeAProteger() { // Lorsqu'un thread excute cette mthode, l'objet ne // peut pas tre utilis par d'autres threads } }

Primitives fournies dans la classe Object


! ! !

wait() : met le thread excutant l'objet en attente notify(): rveille l'un des threads mis auparavant en attente notifyall() : rveille tous les threads mis en attente on ne choisit pas le thread qui est rveill
"

Faible contrle
! !

tat de famine possible ! Sinon, son effet est ignor Diffrent des smaphores

synchronized peut galement tre utilis directement sur un objet


synchronized(un_objet) { // on bloque ici tous les autres accs l'objet }

Notify() doit tre appel aprs wait()


" "

Les entres/sorties en Java


!

Pas de "get/input/scanf" en Java


! !

Programmation Systme en Java


Les entres/sorties

Normal, a n'existe pas directement Il faut utiliser les routines d'entres/sorties de Java

Mthode de rcupration d'une chane :


{ public static String gets() throws IOException { BufferedReader console= new BufferedReader(new InputStreamReader(System BufferedReader InputStreamReader System.in)); System String retour=console.readLine(); } }

Pour lire dans un fichier ou dialoguer sur une socket, c'est peu prs le mme problme...

10

Les classes d'entres/sorties en java


InputStream

Rle des classes d'entre/sortie


!

{In|Out}putStream
! !

Entre

FileInputStream

FilterInputStream

contrle bas niveau : void close() mthodes entre : int read(), int read(Byte[]) mthodes sortie : void write(int), void write(Byte[]) Pour la lecture/criture de fichiers Flux de donnes bufferis (sinon, lecture octet par octet) Bti partir d'un autre flux non bufferis Bti partir d'un autre flux Routines volues pour l'change de donnes {read|write}Float, {read|write}Int, {read|write}UTF

!
BufferedInputStream DataInputStream

File{In|Out}putStream
!

!
OutputStream

Buffered{In|Out}putStream
! !

!
FileOutputStream FilterOutputStream

Data{In|Out}putStream
! !

Sortie
BufferedOutputStream DataOutputStream
11

new DataInputStream(new FileInputStream("unFichier.txt")); DataInputStream FileInputStream


12

Les deux types de sockets rseau


!

UDP : liaison non fiable, envoi d'un Datagramme


!

Programmation Systme en Java


Les sockets

metteur
"

constituer un datagramme envoyer sur un port donn vrification de rception du datagramme sur le port

destinataire
"

TCP : liaison connecte, acquittement et r-mission


!

client
" "

connexion sur le serveur envoi d'une requte sur un port serveur donn en attente sur un port lancement d'un thread traitant la requte reue

serveur
" "

Classe Java InetAddress pour les adresses IPv4 Rsolution de nom (fichier host, dns, etc.)
14

13

InetAddress lo=InetAddress InetAddress.getLocalHost(); InetAddress InetAddress serveur=InetAddress InetAddress.getByName("www.univ-poitiers.fr"); InetAddress

UDP : partie metteur


static public void envoi(String String hostname,int hostport, byte[] buffer) { try { // Rcupration de l'adresse IP InetAddress host_address=InetAddress InetAddress.getByName(hostname); InetAddress // Cration de la socket pour le transport UDP DatagramSocket socket=new DatagramSocket(); DatagramSocket // Cration d'un datagram contenant la suite d'octets // transmettre, indication des adresse et port dest. DatagramPacket paquet= new DatagramPacket(buffer,buffer.length, DatagramPacket host_address,hostport); // envoi du packet sur la socket socket.send(paquet); } catch(Exception Exception e) { System.err.println("Erreur: " + e); System } }

UDP : partie rcepteur


static public void reception(int hostport) { try { // Cration d'un socket sur le port de rception donn DatagramSocket socket=new DatagramSocket(hostport); DatagramSocket // Cration d'un Datagramme (recueillant ici 512 octets) DatagramPacket paquet=new DatagramPacket(new byte[512],512); DatagramPacket // Rception du Datagramme (bloquant si rien reu) socket.receive(paquet); // rcupration des informations pertinentes int port=paquet.getPort(); InetAddress emetteur=paquet.getAddress(); int longueur=paquet.getLength(); byte[] buffer=paquet.getData(); } catch(Exception Exception e) { System.err.println("Erreur: " + e); System } }
15 16

Mthode utile : String.getBytes() renvoyant les octets constituant la chane

TCP : partie client


static public void ConnexionServeur(String String hostname,int hostport) { try { // Rcupration de l'adresse IP du serveur InetAddress svrAddr=InetAddress InetAddress.getByName(hostname); InetAddress // Cration d'une socket TCP vers le port du serveur Socket socket=new Socket(svrAddr,hostport); Socket // Rcupration des flux d'entre/sortie de la socket OutputStream flux_sortie=socket.getOutputStream(); InputStream flux_entree=socket.getInputStream()); // envoi : flux_sortie.write(byte[]) // rception : flux_entree.read(byte[]) } catch(Exception Exception e) { System.err.println("Erreur: " + e); System } }

TCP : coute du serveur


static public void initServeur(int port) { try { // Cration de la socket : coute sur l'une des @IP de la machine
// 10 connexions max sont autorises

InetAddress loc=InetAddress InetAddress.getLocalHost(); InetAddress ServerSocket listen_socket=new ServerSocket(port,10,loc); ServerSocket // Boucle infinie d'interception des requtes de connexion for(;;) { Socket socket=listen_socket.accept(); Thread thread=new TraitementRequete(socket); TraitementRequete thread.start(); } } catch(Exception Exception e) { System.err.println("Erreur: " + e); System } }
17 18

Note: Il peut tre utile de transformer fluxEntree et fluxSortie en Data{In|Out}putStream C'est vous qui voyez...

TCP : traitement des requtes


private class TraitementRequete extends Thread { Socket socket; public TraitementRequete(Socket TraitementRequete Socket socket) { this.socket=socket; } public void run() { try { InputStream flux_entree=socket.getInputStream(); OutputStream flux_sortie=Socket.getOutputStream(); // rception : flux_entree.read(byte[]) // envoi : flux_sortie.write(byte[]) } } catch(Exception Exception e) { System.err.println("Erreur: " + e); System } }

Note: pensez Data{In|Out}putStream Applications en TP...


19

Вам также может понравиться