Le réseau Ce chapitre concerne les classes du package java.net qui permettent de travailler avec le réseau au niveau applicatif. Sommaire 1.LES URL... 2 1.1DÉFINITIONS...2 1.2LES CLASSES URL ET URLCONNECTION... 2 2.LES ADRESSES RÉSEAU (IP)... 3 3.LES TRANSMISSIONS D'INFORMATIONS...3 3.1ARCHITECTURE CLIENT/SERVEUR...3 3.2CONNEXION À UN SERVEUR... 3 3.3PROTOCOLES... 4 4.UDP...4 4.1EMETTEUR...4 4.2RECEPTEUR... 4 5.TCP... 5 5.1LE CLIENT : CLASSE SOCKET... 5 5.2 LE SERVEUR : CLASSES SERVERSOCKET ET SOCKET... 6
1.Les URL 1.1Définitions URL = Uniform Resource Locator Une URL est une adresse qui permet de localiser une ressource sur un réseau. Elle contient : Le protocole utilisé : http, ftp, file, telnet, news, mailto Le nom du serveur ou son adresse IP (voire un numéro de port) Le chemin et le nom du fichier qui fournira les informations http://www.iutc3.unicaen.fr/~rohard/info2a/index.html Les classes Java ne supportent que les protocoles http, ftp, udp, tcp et file (Java 7 : SCTP, SDP, TLS,...). 1.2Les classes URL et URLConnection La classe URL permet de représenter le nom et l' adresse d'une ressource. URL u = new URL( ''http://www.iutc3.unicaen.fr/~rohard'' ); ou new URL( ''http'', ''www.iutc3.unicaen.fr'', ''~rohard'' ); ou d'autres encore... Cette classe fournit la méthode openconnection() qui permet d'ouvrir une connexion réseau correspondant à cette adresse. Cette méthode retourne un objet de type URLConnection. La classe URLConnection permet de représenter une connexion à une ressource distante : elle permet de récupérer un flux d'octet en entrée ou en sortie vers cette ressource. (méthodes getinputstream() et getoutputstream()). class WebTexte { public static void main(string args[]) { try { URL u = new URL(args[0]) ; URLConnection c = u.openconnection() ; BufferedReader in = new BufferedReader ( new InputStreamReader ( c.getinputstream())); String s ; while(( s = in.readline())!= null) System.out.println( s ) ; catch (IOException e) { System.out.println(e.getMessage()) ; Module I6 - Programmation événementielle et Réseau 2/6
2.Les adresses réseau (IP) La classe InetAddress permet de construire et de représenter une adresse IP. On ne peut pas directement construire un objet de cette classe, mais celle-ci offre plusieurs méthodes statiques qui permettent de construire et récupérer la référence d'un objet InetAddress : static InetAddress getbyname(string nomouadresse) ; // à partir d'un nom de serveur static InetAddress getbyaddress( byte[] adr ) ; // à partir d'un tableau de bytes static InetAddress[] getallbyname(string nomouadresse) ; // pour toutes les adresses d'un serveur static InetAddress getlocalhost() ; // pour l'adresse de la machine locale InetAddress a1 = InetAddress.getByName("www.iutc3.unicaen.fr") ; InetAddress a2 = InetAddress.getByName("193.252.148.80") ; InetAddress a3 = InetAddress.getLocalHost() ; String adr = a1.gethostaddress(); String nom = a1.gethostname(); 3.Les transmissions d'informations 3.1Architecture Client/Serveur Serveur : processus rendant un service spécifique identifié par un port particulier (n port), en attente sur une station (@IP) Client : processus appelant le serveur afin d obtenir le service, lancé à la demande à partir généralement de n importe quelle station. Port : sur une même machine plusieurs services peuvent être proposés (web, email, ftp,...) et doivent être accessibles simultanément les points d'accès de ces services sont les 65536 (16 bits) ports logiques (numérotés de 0 à 65535), à ne pas confondre avec les ports physiques (série et parallèle) http://www.iana.org/assignments/port-numbers liste dans /etc/services 3.2Connexion à un serveur Ports réservés (well known ports) Ports déclarés mais utilisables (registred ports) Ports libres (dynamic or privates ports) N port Service 0 Spécial 7 Echo 13 Daytime 21 Ftp 22 Ssh 23 Telnet 25 Smtp 37 Time 80 Www http 110 Pop3 143 Imap 443 Https 1024 1025 49151 49152 65535 $ telnet machine port $ telnet time-a.timefreq.bldrdoc.gov 13 (machine du NIST, Colorado, heure d'une horloge atomique au césium) 54807 08-12-07 15:51:32 00 1 0 819.1 UTC(NIST) $ Module I6 - Programmation événementielle et Réseau 3/6
3.3Protocoles Mode non connecté : il n'y a pas de connexion entre les 2 machines, chaque message doit contenir l'adresse de son destinataire protocole UDP sur Internet principe du SMS ou du courrier postal non fiable mais rapide chaque machine peut être émetteur ou récepteur Mode connecté : déroulement : le serveur se prépare à recevoir une demande de connexion (méthode bloquante) un client demande une connexion au serveur (méthode bloquante) si la demande est acceptée : envois/réceptions de messages tant que la connexion n'est pas close protocole TCP sur Internet principe du téléphone fiable mais lent une machine est serveur, les autres sont clientes 4.UDP Un émetteur et un récepteur, utilisant chacun les classes DatagramSocket et DatagramPacket. 4.1Emetteur DatagramSocket dsout = new DatagramSocket(); String message = ''bonjour''; byte[] mess = message.getbytes(); // transformation des données à envoyer en bytes DatagramPacket outdata = new DatagramPacket (mess, mess.length, inetaddressdestination, port); dsout.send(outdata); 4.2Recepteur DatagramSocket dsin = new DatagramSocket( port ); // nécessite le n du port byte[] data = new byte[max]; DatagramPacket indata = new DatagramPacket(data, data.length); dsin.receive(indata); System.out.println( new String ( indata.getdata() ) ); System.out.println( ''Emetteur : ''+ indata.getadress().gethostname() +'' sur le port ''+ indata.getport() ); Module I6 - Programmation événementielle et Réseau 4/6
5.TCP 5.1Le client : classe Socket La classe Socket permet de créer et gérer une connexion TCP/IP vers un serveur distant sur un port donné. Voici quelques méthodes : Socket ( InetAddress serv, int port ) ; Socket ( String nomserv, int port) ; // entre autres InputStream getinputstream() ; OutputStream getoutputstream() ; void close(); // termine le socket et ferme les flux ouverts int getport() ; // retourne le port utilisé à distance int getlocalport() ; // retourne le port utilisé localement InetAddress getinetaddress() ; // retourne l'adresse utilisée à distance InetAddress getlocaladdress() ; // retourne l'adresse utilisée localement import java.io.*; import java.net.*; public class Client { private Socket sock ; Client ( String serveur ) { try { sock = new Socket (serveur, 50000) ; // envoi d'un message PrintWriter out = new PrintWriter ( new OutputStreamWriter (sock.getoutputstream()),true); // true permet de faire de l'auto-flush. out.println("bonjour Serveur de la part de : " + InetAddress.getLocalHost()) ; // réception d'un message BufferedReader in = new BufferedReader ( new InputStreamReader ( sock.getinputstream())) ; System.out.println(in.readLine());// readline() bloquant sock.close() ; catch (Exception e) { System.out.println(e.getMessage()) ; public static void main(string args[]) { new Client( args[0]) ; Module I6 - Programmation événementielle et Réseau 5/6
5.2 Le serveur : classes ServerSocket et Socket Pour écrire un serveur, il est nécessaire de pouvoir se mettre à l'écoute de demandes de connexion en provenance des clients. C'est le rôle des instances de la classe ServerSocket : on construit une instance de cette classe en lui fournissant le numéro du port sur lequel elle doit se mettre à l'écoute et il suffit alors d'utiliser la méthode accept() sur l'objet construit pour se mettre en attente d'une connexion. La méthode accept() est bloquante jusqu'à ce qu'une connexion se produise et elle renvoie alors une référence sur un objet de type Socket pour gérer la nouvelle connexion. La suite du code est alors similaire à ce qui se passe sur un client (utilisation de Socket). import java.io.*; import java.net.*; public class Serveur { private ServerSocket serv ; private Socket client ; Serveur() { try { serv = new ServerSocket(50000) ; client = sock.accept() ; //bloquant BufferedReader in = new BufferedReader ( new InputStreamReader ( client.getinputstream())) ; System.out.println(in.readLine()); //bloquant PrintWriter out = new PrintWriter ( new OutputStreamWriter ( client.getoutputstream()),true); // true permet de faire de l'auto-flush. out.println("bonjour Client de la part de " + InetAddress.getLocalHost() ) ; client.close() ; catch (Exception e) { System.out.println(e.getMessage()) ; public static void main(string argv[]) { new Serveur( ) ; Le serveur défini dans l'exemple précédent ne permet pas de traiter plus d'une connexion. Module I6 - Programmation événementielle et Réseau 6/6