Programmation réseau
Transcription
Programmation réseau
Programmation réseau Benoit Tremblais [email protected] IUT de Poitiers - département R&T Programmation réseau – p. 1 Introduction Programmation réseau – p. 2 Quelques notions à connaître • Une connexion TCP/IP est caractérisée par : ◦ ◦ • Introduction une adresse IP un numéro de port : désigne une application * ports réservés [0-1023] (21 : FTP, 80 : HTTP, 25 : SMTP...) * ports temporaires [1024-5000] attribués automatiquement par l’OS * ports libres [5000-65635] Il existe deux modes de communications IP : ◦ le mode connecté : TCP qui utilise les sockets * une session par utilisateur entre la connexion et la deconnexion * communications full duplex par flux d’octets * quelques protocoles : HTTP, FTP, SMTP, POP... ◦ le mode non connecté : UDP qui utilise les datagrammes * l’ordre des datagrammes n’est pas assuré * applications : ping, DNS, jeux réseau, streaming audio-vidéo... Classes Sockets Thread UDP Applets Références Programmation réseau – p. 3 Classes du paquetage java.net Objet Classes principales : Authenticator ContentHandler DatagramPacket DatagramSocket MulticastSocket DatagramSocketImpl InetAddress Inet4Address NetWorkInterface Inet6Address PasswordAuthentification ServerSocket SSLServerSocket Socket SSLSocket SocketAddress InetAddress adresse IP Socket Socket client SSLSocket socket client SSL ServerSocket socket serveur SSLServerSocket socket serveur sécurisé URI Uniform Resource Identifier URL Uniform Resource Locator URLConnection connexion sur les ressources accessibles InetSocketAddress URLDecoder, URLEncoder encodage/décodage des URL HttpURLConnection DatagramSocket envoie/réception de paquets jarURLConnection DatagramPacket paquets MulticastSocket socket multicast URI URL URLConnection URLDecoder URLEncoder URLStreamHandler Introduction Classes Sockets Thread UDP Applets Références Programmation réseau – p. 4 java.net Introduction • La librairie java.net prend en charge tous les détails techniques d’une connexion réseau • L’émission et la réception des données fonctionne quasiment de la même façon que la lecture/écriture des données. Classes Sockets Thread UDP Applets Références Programmation réseau – p. 5 Le paquetage java.io • • Ce paquetage contient l’ensemble des classes destinées aux entrées/sorties Il permet notament de gérer la lecture/écriture : ◦ ◦ ◦ ◦ de flots d’octets de flots de caractères de fichiers d’objets (sérialisation) Destination Ecriture Flot de données écran fichier mémoire... Source Lecture Introduction Flot de données Classes mémoire clavier fichier... Sockets Étapes : 1. Création d’un flot (Stream) d’octets, de caractères... 2. Lecture ou écriture du flot : read ou write du flot 3. Fermeture du flot Thread UDP Applets Références Programmation réseau – p. 6 Entrées en mode binaire : InputStream Méthode Description int read() throws IOException lit un octet sur le flux int read(byte[] tab) throws IOException lit les octets sur le flux retourne le nombre d’octets lus int read(byte[] tab, int offset,int size) lit size octets à la position offset throws IOException Introduction long skip(long nbOctets) throws IOException saute des octets void mark(int limite) marque le flux boolean markSupported() vérifie si le marquage est supporté void reset() throws IOException revient à la position déterminée par mark int available() throws IOException octets disponibles dans le flux void close() throws IOException ferme le flux Classes Sockets Thread UDP Applets Références Programmation réseau – p. 7 Sorties en mode binaire : OutputStream Méthode Description void write(int octet) throws IOException écrit un octet dans le flux void write(byte[] tab) throws IOException écrit des octets void write(byte[] tab, int offset,int size) écrit size octets à la position offset throws IOException Introduction void flush() throws IOException vide le tampon void close() throws IOException ferme le flux Classes Sockets Thread UDP Applets Références Programmation réseau – p. 8 Entrées en mode texte : Reader Méthode Description int read() throws IOException lit un caractère int read(char[] tab) throws IOException lit un flux de caractères int read(char[] tab, int offset,int size) lit size caractères à la position offset throws IOException Introduction long skip(long nbOctets) throws IOException saute des caractères void mark(int limite) marque un position boolean markSupported() vérifie que le flux est marquable void reset() throws IOException revient à la position définie par mark boolean ready() throws IOException true si octets présents dans le flux void close() throws IOException ferme le flux Classes Sockets Thread UDP Applets Références Programmation réseau – p. 9 Sorties en mode texte : Writer Méthode Description void write(int car) throws IOException écrit un caractère void write(char[] tab) throws IOException écrit un tableau de caractères void write(char[] tab, int offset,int size) écrit size caractères à la position offset throws IOException void write(String s)throws IOException écrit une chaîne de caractère void write(String s, int offset,int size) écrit une chaîne de caractère throws IOException Introduction void flush() throws IOException vide le tampon void close() throws IOException ferme le flux Classes Sockets Thread UDP réseau – p. 10 AppletsProgrammationRéférences Saisie au clavier import java . io . ∗ ; public class TestSaisieClavier { public static void main ( String args [ ] ) { InputStreamReader in_str_read = new InputStreamReader ( System . in ) ; BufferedReader buff_read = new BufferedReader ( in_str_read ) ; System . out . print ( "Tapez un nombre: " ) ; String s = buff_read . readLine ( ) ; System . out . println ( "vous avez tape"+s ) ; } } Introduction Classes Sockets Thread UDP réseau – p. 11 AppletsProgrammationRéférences Fichier binaire import java . io . ∗ ; public class TestIO { public static void main ( String args [ ] ) { File inputFile = new File ( "a_lire.txt" ) ; File outputFile = new File ( "a_ecrire.txt" ) ; FileInputStream in = new FileInputStream ( inputFile ) ; FileOutputStream out = new FileOutputStream ( outputFile ) ; int c ; while ( ( c = in . read ( ) ) ! = −1) out . write ( c ) ; in . close ( ) ; out . close ( ) ; } } Introduction Classes Sockets Thread UDP réseau – p. 12 AppletsProgrammationRéférences Fichier texte import java . io . ∗ ; public class TestIO { static void main ( String args [ ] ) { File inputFile = new File ( "a_lire.txt" ) ; FileReader fr = new FileReader ( inputFile ) ; BufferedReader br = new BufferedReader ( fr ) ; String ligne = null ; while ( ( ligne = br . readLine ( ) ) ! = null ) System . out . println ( ligne ) ; br . close ( ) ; } } Introduction Classes Sockets Thread UDP réseau – p. 13 AppletsProgrammationRéférences La classe InetAddress Cette classe permet de représenter une adresse internet par deux champs : • • une chaîne de caractère (String) correspondant au nom d’hôte un entier de 32 bits correspondant à l’adresse IP Méthode Description static InetAddress getLocalHost() adresse de l’hôte local throws UnknownHostException static InetAddress getByName(String host) adresse par le nom d’hôte throws UnknownHostException static InetAddress[] getAllByName(String host) les différentes adresse d’un site throws UnknownHostException Introduction String getHostName() retourne le nom de l’hôte String getHostAddress() %d.%d.%d.%d byte[] getAddress() IP sous la forme d’un tableau d’octets Classes Sockets Thread UDP réseau – p. 14 AppletsProgrammationRéférences La classe InetAddress InetAddress localhost = InetAddress . getLocalHost ( ) ; System . out . println ( localhost ) ; InetAddress adresse = InetAddress . getByName ( "http://www.univ-poitiers.fr" ) ; System . out . println ( adresse ) ; System . out . println ( "Hote = "+adresse . getHostName ( ) ) ; System . out . println ( "Adresse de l’hote = "+adresse . getHostAddress ( ) ) ; InetAddress adresse2 = InetAddress . getByName ( "195.167.48.12" ) ; System . out . println ( adresse2 ) ; InetAddress [ ] adresses = InetAddress . getAllByName ( "www.microsoft.com" ) ; System . out . println ( adresses ) ; Introduction Classes Sockets Thread UDP réseau – p. 15 AppletsProgrammationRéférences URL Programmation réseau – p. 16 Les classes relatives aux URLs Introduction Méthode Description URL(String url) constructeur URL(URL urlAbsolue, String urlRelative) constructeur URLConnection openConnection() renvoie une connexion sur l’URL InputStream openStream() permet de lire le contenu de l’URL String getAuthority() authorité int getDefaultPort() port par défaut String getFile() fichier String getHost() hote String getPath() chemin int getPort() port String getProtocol() protocole String getQuery() requête String getRef() référence (anchor) String getUserInfo() informations utilisateurs Classes Sockets Thread UDP réseau – p. 17 AppletsProgrammationRéférences Exemple d’utilisation URLs import java . net . ∗ ; import java . io . ∗ ; //... URL url = new URL ( "http://service.host.domain/chemin/fichier. extention?parametre=valeur#fragment" ) ; System . out . println ( "Authority ="+url . getAuthority ( ) ) ; System . out . println ( "DefaultPort ="+url . getDefaultPort ( ) ) ; System . out . println ( "File ="+url . getFile ( ) ) ; System . out . println ( "Host ="+url . getHost ( ) ) ; System . out . println ( "Path ="+url . getPath ( ) ) ; System . out . println ( "Port ="+url . getPort ( ) ) ; System . out . println ( "Protocol ="+url . getProtocol ( ) ) ; System . out . println ( "Query ="+url . getQuery ( ) ) ; System . out . println ( "Ref ="+url . getRef ( ) ) ; System . out . println ( "UserInfo ="+url . getUserInfo ( ) ) ; System . out . println ( URLEncoder . encode ( "èàéèabcde !..." , "UTF-8" ) ) ; //... Introduction Classes Sockets Thread UDP réseau – p. 18 AppletsProgrammationRéférences Exemple d’utilisation URLs http://service.host.domain/chemin/fichier.extention?parametre=valeur#fragment Introduction Classes Sockets Thread UDP réseau – p. 19 AppletsProgrammationRéférences La classe URLConnection Les méthodes ci-dessous permettent de retrouver des informations sur le document de l’URL (en-tête du flux) Introduction Méthode Description long getDate() date long getLastModified() Date de dernière modification String getContentType() type MIME du contenu int getContentLenght() taille du contenu String getContentEncoding() codage du contenu Map getHeaderField() tous les champs de l’en-tête String getHeaderField(String nom) champ de l’en-tête par nom String getHeaderField(int num) champ de l’en-tête par numéro de ligne InputStream getInputStream() pour la lecture du contenu OutputStream getOutputStream() pour l’upload vers le serveur Classes Sockets Thread UDP réseau – p. 20 AppletsProgrammationRéférences La classe HttpURLConnection Cette classe étend la classe URLConnection pour la gestion du protocole HTTP Méthode Description String getRequestMethod() méthode de la requête http (GET, POST, HEADER, PUT, DELETE...) boolean usingProxy() true s’il y a un serveur de Proxy int getResponseCode() code de statut http de la requête (HTTP_OK, HTTP_ACCEPTED, HTTP_NOT_FOUND...) Introduction String getResponsableMessage()) message en cas d’erreur InputStream getErrorSream() flux d’erreur en cas d’erreur Classes Sockets Thread UDP réseau – p. 21 AppletsProgrammationRéférences La classe URLEncoder et URLDecoder Ces classes permettent de coder une chaîne de caractères contenant des caractères spéciaux en une chaîne UTF-8. Méthode Description static String URLEncoder.encode(String s, String enc) String → URLString suivant l’encodage enc (UTF-8) String URLDecoder.decode(String s, String enc) URLString → String Exemple : URLEncoder.encode(“abcdeèàéè !...","UTF-8") retourne “abcde%C3%A8%C3%A0%C3%A9%C3%A8++%21...” Introduction Classes Sockets Thread UDP réseau – p. 22 AppletsProgrammationRéférences Les sockets Programmation réseau – p. 23 Connexion : côté client Ce qu’il faut pouvoir faire : 1. Établir la connexion entre le client et le serveur ⇒ classe Socket 2. Envoyer des messages au serveur ⇒ classe PrintWriter 3. Recevoir des messages du serveur ⇒ classe BufferedReader Introduction Classes Sockets Thread UDP réseau – p. 24 AppletsProgrammationRéférences La classe Socket Constructeurs : • • • • • Introduction Socket() Socket(String host, int port) Socket(InetAddress serveurAdd, int port) Socket(String host, int port, InetAddress localAdd, int localPort) Socket(InetAddress serveurAdd, int port, InetAddress localAdd, int localPort ) Méthode Description OutputStream getOutputStream() flux de sortie vers lequel envoyer les données au serveur InputStream getInpuStream() flux d’entrée pour lire les données venant du serveur void close() déconnecte et referme la socket Classes Sockets Thread UDP réseau – p. 25 AppletsProgrammationRéférences Envoi et réception des données Envoi : 1. Connexion : Socket socket = new Socket(“192.168.0.1”,4345); 2. Création d’un PrintWriter associé au flux de sortie de la socket : PrintWriter writer = new PrintWriter(socket.getOutputStream()); 3. Écriture : writer.println(“message”); 4. Fermeture de la socket : socket.close(); Réception : 1. Connexion : Socket socket = new Socket(“192.168.0.1”,4345); 2. Création d’un InputStreamReader associé au flux d’entrée de la socket : InputStreamReader reader = new InputStreamReader(socket.getInputStream() 3. Créer un tampon de lecture BufferedReader associé au flux d’entrée : BufferedReader buff = new BufferedReader(reader); 4. Lecture : String message = buff.readLine(); 5. Fermeture de la socket : socket.close(); Introduction Classes Sockets Thread UDP réseau – p. 26 AppletsProgrammationRéférences Connexion côté serveur : ServerSocket Il faut 2 sockets : • • 1 socket serveur ServerSocket qui attend des requêtes des clients 1 socket « classique » pour communiquer avec le client Constructeur : • ServerSocket(int numPort) Méthode Description Socket accept() attend une connexion client, s’il y a une connexion envoie 1 socket sur un port différent de celui du client void close() referme le serveur 1. Écoute du port 5434 : ServerSocket serveurSock = new ServerSocket(5434): 2. Connexion du client au serveur : Socket sock = new Socket(“192.168.0.1”,5434); 3. Le serveur créer une connexion socket au client : Socket sock2 = serveurSock.accept(); Introduction Classes Sockets Thread UDP réseau – p. 27 AppletsProgrammationRéférences Les threads Programmation réseau – p. 28 Multi-thread • • • • • un processus (application) peut contenir plusieurs threads Les threads permettent d’exécuter plusieurs portions de code simultanément Un thread est une pile d’appel Si l’ordinateur possède plusieurs processeurs, les tâches s’exécutent réellement simultanément Sinon, il y a une alternance très rapide entre les piles d’appel Intérêt pour la programmation réseau : • Un serveur va pouvoir gérer plusieurs clients simultanément La classe java.lang.Thread : • • Introduction Thread(Runnable target) crée un thread associé à la tâche target Thread(Runnable target, String name) : crée un thread nommé Méthode Description void start() démarre le thread static void sleep(long t) endort le thread pendant t ms Classes Sockets Thread UDP réseau – p. 29 AppletsProgrammationRéférences L’interface Runnable • • • Introduction Un thread n’est pas dissociable de sa tâche (portion de code qu’il exécute) En Java, la tâche d’un thread est une classe qui implémente l’interface Runnable Cette interface ne contient qu’une méthode : Méthode Description void run() 1ère méthode à s’exécuter dans un nouveau thread Pour lancer un nouveau thread, il faut passer un objet Runnable au constructeur Thread Classes Sockets Thread UDP réseau – p. 30 AppletsProgrammationRéférences Thread : exemple public class TestRunnable implements Runnable { public void run ( ) { methode1 ( ) ; } public void methode1 ( ) { System . out . println ( ‘ ‘ Methode 1’’ ) ; } } start main methode1 run thread principal thread1 public class TestThread { public static void main ( String [ ] args ) { Runnable tacheThread = new TestRunnable ( ) ; Thread thread1 = new Thread ( tacheThread ) ; thread1 . start ( ) ; System . out . println ( ‘ ‘ Fini ! ’’ ) ; } } Introduction Classes Sockets Thread UDP réseau – p. 31 AppletsProgrammationRéférences Thread : cycle de vie • • • • Quand on lance un thread, celui-ci devient exécutable Un thread s’exécute quand l’ordonnanceur de la machine virtuelle Java l’a choisi pour être le thread actif Sur un ordinateur monoprocesseur, il ne peut y avoir qu’un thread actif à la fois 1 thread peut aussi être bloqué (i.e temporairement non exécutable) Problème : • • On ne peut pas prévoir le comportement de l’ordonnanceur L’ordonnanceur peut exécuter un thread pendant trop longtemps au détriment des autres Une solution : Introduction • Mettre les threads périodiquement en sommeil (ex : Thread.sleep(4000);) de manière à désactiver les threads • Quand le thread se réveille, il redevient exécutable Classes Sockets Thread UDP réseau – p. 32 AppletsProgrammationRéférences Thread : accès concurrent • Les threads partagent les mêmes données ⇒ 2 thread effectuant la même tâche peuvent interferrer Solution : • Vérouiller l’accés aux données pendant l’exécution d’un tâche Comment : • Synchroniser les méthodes qui ont une action sur les données en ajoutant le modificateur synchronized devant ces méthodes Inconvénients : • • Introduction La synchronisation baisse les performances 2 threads peuvent se vérouiller l’un l’autre Classes Sockets Thread UDP réseau – p. 33 AppletsProgrammationRéférences UDP Programmation réseau – p. 34 Programmation par paquets : UDP Contructeurs : • • Introduction DatagramPacket(byte[] buff, int size) DatagramPacket(byte[] buff, int size, InetAddress dest, int port) Classes Méthode Description InetAddress getAddress() adresse ip int getPort() port byte[] getData() données du paquet int getLength() longueur du datagramme void setAddress(InetAddress ip) adresse ip void setPort(int numero) port void setData(byte[] data) données du paquet void setLength(int length) longueur du datagramme Sockets Thread UDP réseau – p. 35 AppletsProgrammationRéférences La classe DatagramSocket Cette classe permet d’envoyer et de recevoir les datagrammes Contructeurs : • • • DatagramSocket() throws SocketException DatagramSocket(int numPort) throws SocketException DatagramSocket(int numPort, InetAddress ip) throws SocketException Méthode Description void send(DatagramPacket paquet) envoi un paquet void receive(DatagramPacket paquet) reçoit un paquet garde la main jusqu’à la réception d’un paquet Remarque : Pas de ServerSocket • • Introduction La même socket sert à la fois à l’envoi et à la reception des données Un DatagramSocket peut recevoir des données d’un grand nombre de machines distinctes Classes Sockets Thread UDP réseau – p. 36 AppletsProgrammationRéférences La classe DatagramSocket • Il est possible de connecter un DatagramSocket à un destinataire ⇒ Cela simplifie l’envoie de série de datagrammes Introduction Méthode Description void connect(InetAddress addr, int port) connexion void disconnect() déconnexion • Afin d’éviter les temps d’attente infinie, on peut fixer un temps d’attente maximum avec la méthode setSoTimeOut(int tps) • Lorsque le délais expire, la méthode receive lève une exception SocketTimeoutException Classes Sockets Thread UDP réseau – p. 37 AppletsProgrammationRéférences Choix de la taille des datagrams • • • • La taille maximale thérorique est 216 − 8 (taille de l’en-tête) Certains protocoles imposent une taille particulière ⇒ pas le choix Transfert de fichiers : utiliser la plus grande taille possible Fiabilité du réseau : ◦ ◦ • Introduction réseau fiable : grande taille de datagramme réseau peu fiable : petite taille de datagramme La taille des datagrammes est souvent 8192 octets Classes Sockets Thread UDP réseau – p. 38 AppletsProgrammationRéférences Les applets Programmation réseau – p. 39 Les applets Définition : Une applet est un petit programme qui s’exécute dans un navigateur Web • Une applet est un container de composants graphiques Côté serveur : Une applet est généralement un programme graphique (animation, interface graphique...) • • 1. Une applet est définie dans une classe qui hérite de la classe JApplet Côté client : 3. La classe est définie dans une page HTML 2. La classe est compilée 1. Requête HTTP pour la page HTML 2. Retour de la page HTML 3. Requête de la classe applet 4. La classe applet est téléchargée depuis un serveur Web 5. Elle est ensuite exécutée au sein du navigateur Introduction Classes Sockets Thread UDP réseau – p. 40 AppletsProgrammationRéférences Applets et sécurité • • • • • Introduction Les applets ne peuvent pas lire toutes les propriétés du système Les applets ne peuvent pas lire ou écrire sur le disque local Les applets ne peuvent pas exécuter des programmes locaux Les applets ne peuvent pas définir des méthodes natives Les applets ne peuvent pas se connecter à un autre serveur que le serveur source de l’applet Classes Sockets Thread UDP réseau – p. 41 AppletsProgrammationRéférences La classe java.applet.Applet Méthode Utilisation void init() lorsque l’applet est instanciée void start() à chaque fois que l’applet devient visible void stop() à chaque fois que l’applet devient invisible void destroy() lorsque l’applet va être détruite du container du navigateur void paint(Graphics g) lorsque l’applet doit être redessinée Exemple : Introduction Classes import javax . swing . ∗ ; import java . awt . Graphics ; public class TestApplet extends JApplet { public void init ( ) { . . . } public void start ( ) { . . . } public void stop ( ) { . . . } public void destroy ( ) { . . . } public void paint ( Graphics g ) { . . . } } Sockets Thread UDP réseau – p. 42 AppletsProgrammationRéférences Définition de l’applet dans une page HTML L’applet est définie par la balise <APPLET> qui peut avoir les propriétés suivantes : CODE permet de spécifier le nom de l’applet CODEBASE URL où sera téléchargée la classe de l’applet WIDTH largeur en pixel de l’applet dans le document HTML HEIGHT hauteur en pixel de l’applet dans le document HTML ALIGN alignement de l’applet : left, right, middle, top, bottom,texttop absmiddle, baseline, absbottom VSPAVE distance verticale en pixel avec les autres objets HSPACE distance horizontale en pixel avec les autres objets ALT texte à afficher à la place de l’applet NAME nom référence de l’applet dans la page HTML Paramètres à transmettre à une applet : <APPLET CODE=”TestApplet.class” WIDTH=300 HEIGHT=200> <PARAM NAME=”NomArg” VALUE=”ValArg”> </APPLET> Récupération des informations par l’applet : String getParameter(String nom) Introduction Classes Sockets Thread UDP réseau – p. 43 AppletsProgrammationRéférences Lancer une applet • • Introduction appletviewer TestApplet.html lire le fichier avec un navigateur web comprenant une machine virutelle Java Classes Sockets Thread UDP réseau – p. 44 AppletsProgrammationRéférences Applet : exemple import javax . swing . ∗ ; import java . awt . ∗ ; public class TestJApplet2 extends JApplet { protected JButton bouton = new JButton ( "bouton" ) ; protected Object [ ] icones = { "icone1.gif" , "icone2.gif" , "icone3.gif" } ; protected JComboBox combo = new JComboBox ( icones ) ; protected JButton image = new JButton ( new ImageIcon ( "./nb48x48.gif" ) ) ; public void init ( ) { System . out . println ( "init : l’applet vient d’atre instanciee dans le conta this . getContentPane ( ) . setLayout ( new FlowLayout ( ) ) ; this . getContentPane ( ) . add ( combo ) ; this . getContentPane ( ) . add ( image ) ; } public void start ( ) { System . out . println ( "start : l’applet devient visible" ) ; System . out . println ( this . getDocumentBase ( ) ) ; System . out . println ( this . getCodeBase ( ) ) ; } Introduction Classes Sockets Thread UDP réseau – p. 45 AppletsProgrammationRéférences Applet : exemple public void stop ( ) { System . out . println ( "stop : l’applet devient invisible" ) ; } public void destroy ( ) { System . out . println ( "destroy : l’applet va etre detruite du container du n } } Introduction Classes Sockets Thread UDP réseau – p. 46 AppletsProgrammationRéférences Communication et applets Communication avec le navigateur AppletContext getAppletContext() récupère le contexte de l’applet void showStatus(String texte) affiche texte dans la barre d’état du navigateur affiche un nouveau document void showDocument(URL url) dans le navigateur void showDocument(URL url, String dest) affiche un nouveau document dans la frame portant le nom dest Image getImage(URL url) charge l’image localisée à l’URL url AudioClip getAudioClip(URL url) charge le clip audio localisé à l’URL url Communication entre applets Introduction Méthodes de l’AppletContext Comportement Applet getApplet() récupère le contexte de l’applet Enumeration getApplets() récupère toutes les applets du document Classes Sockets Thread UDP réseau – p. 47 AppletsProgrammationRéférences Références « Programmation réseau avec Java » E LLIOTTE RUSTY H AROLD O’R EILLY, 2001 « Java tête la première » K ATHY S IERRA , B ERT B ATES O’R EILLY, 2004 « Java : La maîtrise » J ÉROME B OUGEAULT E YROLLES , 2003 Introduction Classes Sockets Thread UDP réseau – p. 48 AppletsProgrammationRéférences