Les Sockets et Java Cours Harmonisation Anne-Marie Déry.

Slides:



Advertisements
Présentations similaires
Programmation réseau Les sockets de Berkeley
Advertisements

Sérialisation des objets
Le mécanisme des exceptions
Cours réseaux Essi2 Anne-Marie Déry
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Programmation Réseaux Illustration : Les Sockets en Java
Programmation Réseaux Illustration : Les Sockets en Java
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Communication par diffusion : Multicast
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
1 I. Bus logiciel ? Mireille Blay-Fornarino Daprès et Sacha Et (cf. références en bas.
Applications distribuées et parallèlisme La communication ne doit pas rester bloquée pour un client.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java
Communication par diffusion : Multicast Clientn Serveur Client1 Client2 Gr.
Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Mode Message Asynchrone (interface Socket)
- Couche 7 - Couche application. Sommaire 1)Introduction 1)DNS 1)FTP et TFTP 1)HTTP 1)SNMP 1)SMTP 1)Telnet.
(Classes prédéfinies – API Java)
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.

Servlet JAVA.
FLSI602 Génie Informatique et Réseaux
À travailler seuls Concepts généraux Mise en œuvre Java Année
Common Gateway Interface
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
COURS DE PROGRAMMATION ORIENTEE OBJET :
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Analyse des protocoles de la couche application
Labview Programmation réseau Communication par sockets
Les instructions PHP pour l'accès à une base de données MySql
Système d’Exploitation
Communication entre processus - TCP From Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edition 3, © Addison-Wesley 2001 Chapitre.
Les relations clients - serveurs
À travailler seuls Concepts généraux Mise en œuvre Java Année
Programmation concurrente
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
COURS DE PROGRAMMATION ORIENTEE OBJET :
1212 Entrée et sortie de fichiers Objectifs À la fin de ce cours, vous serez capables de : • Lire à partir de la console • Écrire sur la console.
VAL3 Ethernet - Sockets A partir VAL 3 Version 4.x.
1 Fichers Binaires, Accès Direct et Objets. 2 Données binaires. Il s'agit ici de lire et écrire des données binaires par opposition à du texte. Pour ce.
Développement d’application client/serveur
Communication entre processus From Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edition 3, © Addison-Wesley 2001 Chapitre.
OSI et TCP/IP CNAM
Cours Les flux ou streams. Cours 162 Flux : objet possédant des méthodes capables de lire ou écrire des flots d’octets sur tout support (mémoire,
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Tutorat en bio-informatique
Entrées / Sorties.
Les Réseaux Informatiques Clients & Serveurs Le protocole FTP Laurent JEANPIERRE DEUST AMMILoR.
Les sockets.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Les Réseaux Informatiques
Couche transport du modèle OSI
 Formulaires HTML : traiter les entrées utilisateur
Ingénierie des réseaux - Chapitre 2 bis Les sockets en Java
Réseaux Informatiques
Introduction à la programmation objet avec java
Ingénierie des réseaux
Les bases du protocole Modbus
Architecture Client/Serveur
L. Gurret – M. Herve – P. Mignon – J. Prarioz. Introduction  Dernière étape d’analyse  Cahier des charges, spécifications et conception orientée objet.
Client/Server Socket. Client/Serveur.
TP N°4 Développement d’ une application
Transcription de la présentation:

Les Sockets et Java Cours Harmonisation Anne-Marie Déry

Sockets ? Outil de communication pour échanger des données entre un client et un serveur Canaux de communication (descripteur dentrée sortie dans lesquels on écrit et sur lesquels on lit)

Architecture client serveur Mode de communication quun hôte établit avec un autre hôte qui fournit un service quelconque application opération Client Serveur Send request Send reply « protocole dapplication »

Exemples d applications Classiques Serveur de Messages Serveur de newsSockets Serveur de fichiers Applications distribuéesRMI Réservation de voyages Serveurs de vente Composants distribués….EJBs

Un peu de vocabulaire Client : entité qui fait l appel Sockets : moyen de communication entre ordinateurs Adresses IP : adresse dun ordinateur Serveur : entité qui prend en charge la requête Serveur de noms (DNS) : correspondances entre noms logiques et adresses IP (Annuaire) Port : canal dédié à un service Protocole :langage utilisé par 2 ordinateurs pour communiquer entre eux

Adresse Internet et Port Adresse internet attribuée à chaque nœud du réseau série d octets dont la valeur dépend du type de réseau associée à un nom logique (Domain Name Server) Chaque hôte possède environ ports Port canal dédié à un service spécifique 80 pour le service http 25 pour le service SMTP TCP implique une file dattente par connexion UDP implique une file dattente unique pour le port

Ports réservés TCP Serveur FTP : 21 Serveur Telnet : 23 Serveur SMTP : 25 UDP Agent SNMP : 161 Logger SNMP : 162 Serveur rwhod : 513 Serveur multi processusApplications transactionnelles 1 à 1024 services fondamentaux (administrateurs) (sous unix cf. le fichier /etc/services) 1025 à 5000 disponibles pour les utilisateurs

Sockets (Communication Client serveur) Serveur connecte le client sur un nouveau no de port et reste en attente sur le port original Client et serveur communiquent en écrivant et lisant sur un socket Serveur est à lécoute des requêtes sur un port particulier Un client doit connaître lhôte et le port sur lequel le serveur écoute. Le client peut tenter une connexion au serveur

Contexte : modèle OSI Couches Transports : Transmission Control Protocol User Datagram Protocol Couche communication : Internet Protocol Mode connecté vs mode non connecté rester en ligne pour demander plusieurs services ou rappeler lentreprise pour chaque nouvelle requête

Sockets en Java ? BSD sockets UNIX au dessus de TCP ou UDP En Java toutes les classes relatives aux sockets sont dans le package java.net Une infrastructure puissante et flexible pour la programmation réseau

Le Package net 4 Des Exceptions 4 Des entrées Sorties 4 Des Sockets 4 …... Plusieurs hiérarchies de classes

Des types de Sockets ServerSocket DatagramSocket MulticastSocket Socket Object

Des exceptions Exception IOException SocketExceptionProtocolException UnknownHostExceptionUnknownServiceException BindException ConnectException

Des Entrées Sorties Object InputStream FilterInputStream ObjectInputStream DataInputStream OutputStream FilterOutputStream ObjectOutputStream DataOutputStream

Autres Classes Object InetAdress DatagramPacketSocketImpl PlainSocketImpl

Programmation en Java 4 Les opérations de base 4 Un exemple : le service SMTP 4 Un serveur dEcho 4 Aperçus des autres types de communication –Plusieurs Clients gérés simultanément ( ligne non occupée) –Client Serveur dataGram –Communication Broadcast (réunion téléphonique)

Java.net.InetAddress : nommage La classe InetAddress 2 constructeurs : un par défaut qui crée une adresse vide (cf la méthode accept sur Socket) un qui prend le nom de la machine hôte et ladresse IP de la machine. Des accesseurs en lecture : pour récupérer ladresse IP dune machine (getByName, getAllByName), des informations sur la machine hôte (getLocalHost, getLocalAddress, getLocaName) Des comparateurs : égalité (equals) et type dadresse (isMulticastAddress) …..

TCP et Sockets 2 classes : Socket et ServerSocket (java.net package)

Flot de requêtes du client vers le serveur application opération Client Serveur Ouvrir connexion req1 req2 req3 reqn Fermer la connexion

TCP et Sockets La classe Socket : une batterie de constructeurs : par défaut, no de port + adresse / nom de machine et service distante, + no de port + adresse locale, créent un socket en mode Stream ou DataGramme des accesseurs en lecture : no de port et adresse à laquelle il est connecté, no de port et adresse à laquelle il est lié, input et output Stream associés (getPort, getInetAddress, getLocalPort, getLocalAddress, getInputStream, getOutputStream…) des méthodes : close...

TCP et Sockets La classe ServerSocket des constructeurs : par défaut, no de port associé, + taille de la liste de clients en attente + adresse... des accesseurs en lecture : no de port sur lequel le socket écoute, adresse à laquelle il est connecté (getPort, getInetAddress, …) des méthodes : accept pour accepter une communication avec un client, close...

Un socket : une entrée sortie dédiée au réseau Gestion similaire des entrées sorties standard (écran, clavier) et des fichiers En sortie (ex. System.out) : java.io.PrintStream (ou PrintWriter) utilise un flot dirigé vers une sortie java.io.OutputStream En entrée (ex. System.in) : java.io.InputStream (ou BufferedReader)

Comment ouvrir un socket ? Dans un client Socket MyClient; try { MyClient = new Socket("Machine name", PortNumber); } catch (IOException e) { System.out.println(e); } Machine name : machine à laquelle on veut se connecter PortNumber port sur lequel tourne le serveur (> 1023)

Dans un serveur ? ServerSocket MyService; try { MyService = new ServerSocket(PortNumber); } catch (IOException e) {System.out.println(e);} Création dun objet socket pour écouter et accepter les connexions des clients Socket clientSocket = null; try { ServiceSocket = MyService.accept();} catch (IOException e) {System.out.println(e); }

Comment créer un Input Stream ? Côté client : pour recevoir une réponse du serveur try {input = new DataInputStream(MyClient.getInputStream());} catch (IOException e) {System.out.println(e);} DataInputStream : lire des lignes de texte, des entiers, des doubles,des caractères... ( read, readChar, readInt, readDouble, and readLine,. )

Côté Serveur pour recevoir les données dun client DataInputStream input;: try { input = new DataInputStream(serviceSocket.getInputStream()); } catch (IOException e) {System.out.println(e);}

Comment créer un Output Stream? Côté client : pour envoyer une information au serveur (PrintStream ou DataOutputStream) PrintStream output; try {output = new PrintStream(MyClient.getOutputStream;} catch (IOException e) {System.out.println(e);} PrintStream pour afficher des valeurs des types de base (write et println) …..

Côté Serveur Pour envoyer des informations au client PrintStream output; try { output = new PrintStream(serviceSocket.getOutputStream()); } catch (IOException e) {System.out.println(e);} DataOutputStream : écrire des types de données primitifs; (writeBytes…) output= new DataOutputStream(serviceSocket.getOutputStream());

Autres entrées sorties echoSocket = new Socket( "jessica", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); ATTENTION Utilisation des ObjectInputStream et ObjectOutputStream Loutput doit être initialisé en premier sinon blocage à la Création du flux de sortie. Le BufferedReader prend un Reader en paramètre et non un Stream

Comment fermer un socket ? Fermer les output et input stream avant le socket. Côté client output.close(); input.close(); MyClient.close(); Côté serveur output.close(); input.close(); serviceSocket.close(); MyService.close();

Comment écrire un client ? Toujours 4 étapes Ouvrir un socket. Ouvrir un input et un output stream sur le socket. Lire et écrire sur le socket en fonction du protocole du serveur. Effacer Fermer Seule létape 3 change selon le serveur visé

Client SMTP (Simple Mail Transfer Protocol), import java.io.*; import java.net.*; public class smtpClient { public static void main(String[] args) { Socket smtpSocket = null; // le socket client DataOutputStream os = null; // output stream DataInputStream is = null; // input stream try { smtpSocket = new Socket("hostname", 25); os = new DataOutputStream(smtpSocket.getOutputStream()); is = new DataInputStream(smtpSocket.getInputStream()); } catch (UnknownHostException e) { System.err.println("Don't know about host: hostname"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: hostname"); }

Le protocole SMTP, RFC1822/3 if (smtpSocket != null && os != null && is != null) { try{os.writeBytes("HELO\n"); os.writeBytes("MAIL From: os.writeBytes("RCPT To: os.writeBytes("DATA\n"); os.writeBytes("From: os.writeBytes("Subject: Qui est là ?\n"); os.writeBytes("Vous suivez toujours ?\n"); // message os.writeBytes("\n.\n"); os.writeBytes("QUIT");

SMTP // attente de "Ok" du serveur SMTP, String responseLine; while ((responseLine = is.readLine()) != null) { System.out.println("Server: " + responseLine); if (responseLine.indexOf("Ok") != -1) {break;}} os.close(); is.close(); smtpSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException){ System.err.println("IOException: " + e);} } } }.

Serveur Echo Un serveur similaire à echo ( port 7). Reçoit un texte du client et le renvoie identique Le serveur gère un seul client.

Déclarations import java.io.*; import java.net.*; public class echo3 { public static void main(String args[]) { ServerSocket echoServer = null; String line; DataInputStream is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999);} catch (IOException e) {System.out.println(e); }

try { clientSocket = echoServer.accept(); is = new DataInputStream(clientSocket.getInputStream()); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } catch (IOException e) { System.out.println(e);} } }

Plusieurs clients application Clientn Serveur Ouvrir connexion application Client1 application Client2 S1 S2 Sn

Plusieurs Clients Utiliser des threads pour accepter plusieurs clients simultanément. Le serveur gère un thread par client Thread constructeur start run

Datagrammes UDP et Sockets 2 classes : DatagramPacket et DatagramSocket Datagramme = un message indépendant envoyé sur le réseau arrivée, temps darrivée et contenu non garantis packages dimplémentation de communication via UDP de datagrammes

Exemple Un serveur de citation qui écoute un socket type datagram et envoie une citation si le client le demande Un client qui fait simplement des requêtes au serveur ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP

Envoi de datagrammes application opération Client Serveur req1 rep1 reqn repn

Classe DatagramSocket Des constructeurs : par défaut, + no port + Adresse Inet Des accesseurs en lecture : adresse à laquelle le socket est lié, est connecté, le no port auquel il est lié, connecté, taille du buffer reçu ou envoyé (getInetAddress, getLocalAddress, getPort, getLocalPort, getReceivedBufferSize, getSendBufferSize…) Des méthodes : pour se connecter à une adresse, pour se déconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)

Classe DatagramPacket Des constructeurs : buffer + longueur de buffer + adresse destination + port… Des accesseurs en lecture : adresse à laquelle le paquet est envoyé, le no port à laquelle le paquet est envoyé, la donnée transmise (getAddress, getPort, getData, getLength…)

Une Application Client Serveur Le serveur reçoit en continu des paquets mode datagramme sur un socket un paquet reçu = une demande de citation dun client le serveur envoie en réponse un paquet qui contient une ligne "quote of the moment" Lapplication cliente envoie simplement un paquet datagramme au serveur indiquant quil souhaite recevoir une citation et attend en réponse un paquet du serveur.

La classe QuoteServer import java.io.*; public class QuoteServer { public static void main(String[] args) throws IOException { new QuoteServerThread().start(); } la classe QuoteServerThread implémente toute la logique du serveur.

La classe QuoteServerThread public QuoteServerThread() throws IOException { this("QuoteServer"); } public QuoteServerThread(String name) throws IOException { super(name); socket = new DatagramSocket(4445); Création dun DatagramSocket sur le port 4445 qui permet au serveur de communiquer avec tous ces clients try { in = new BufferedReader(new FileReader("one-liners.txt")); } catch (FileNotFoundException e) System.err.println("Couldn't open quote file. " + "Serving time instead."); } Le constructeur ouvre aussi un BufferedReader sur un fichier qui contient une liste de citations ( une citation par ligne)

La méthode RUN implémentation du thread contient une boucle qui tant quil y a des citations dans le fichier attend larrivée d un DatagramPacket correspondant à une requête client sur un DatagramSocket. Byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); En réponse une citation est mise dans un DatagramPacket et envoyée sur le DatagramSocket au client demandeur. String dString = null; if (in == null) dString = new Date().toString(); else dString = getNextQuote(); buf = dString.getBytes(); InetAddress address = packet.getAddress(); int port = packet.getPort(); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet);

Suite Adresse Internet + numéro de port (issus du DatagramPacket ) = identification du client pour que le serveur puisse lui répondre Larrivée du DatagramPacket implique une requête ->contenu du buffer inutile Le constructeur utilisé pour le DatagramPacket : un tableau doctets contenant le message et la taille du tableau + Ladresse Internet et un no de port. Lorsque le serveur a lu toutes les citations on ferme le socket de communication. socket.close();

La classe QuoteClient envoie une requête au QuoteServer, attend la réponse et affiche la réponse à lécran. Variables utilisées : int port; InetAddress address; DatagramSocket socket = null; DatagramPacket packet; byte[] sendBuf = new byte[256]; Le client a besoin pour s exécuter du nom de la machine sur laquelle tourne le serveur if (args.length != 1) { System.out.println("Usage: java QuoteClient "); return; }

La partie principale du main Création d un DatagramSocket DatagramSocket socket = new DatagramSocket(); Le constructeur lie le Socket à un port local libre Le programme envoie une requête au serveur byte[] buf = new byte[256]; InetAddress address = InetAddress.getByName(args[0]); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445); socket.send(packet); Ensuite le client récupère une réponse et laffiche

Broadcast application Clientn Serveur application Client1 application Client2 Gr

Exemple de multicast Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)

Classe MulticastServer Des constructeurs : par défaut, port à utiliser Des accesseurs en lecture : adresse du groupe (getInterface…) Des méthodes : pour envoyer un paquet datagramme, pour joindre ou quitter un groupe (send, joinGroup, leaveGroup)

Multicast: MulticastSocket Type de socket utilisé côté client pour écouter des paquets que le serveur « broadcast » à plusieurs clients.. Une extension du QuoteServer : broadcast à intervalle régulier à tous ses clients Le serveur a un nouveau nom et crée un MulticastServerThread qui contient le cœur du serveur. import java.io.*; public class MulticastServer { public static void main(String[] args) throws IOException { new MulticastServerThread().start(); }

public class MulticastServerThread extends QuoteServerThread {... } utilisation du constructeur par héritage et héritage de variables et de la méthode getNextQuote

Une nouvelle méthode RUN public void run() { while (moreQuotes) { try { byte[] buf new byte[256]; // don't wait for request...just send a quote String dString = null; if (in == null) dString = new Date().toString(); else dString = getNextQuote(); buf = dString.getBytes(); InetAddress group = InetAddress.getByName(" "); DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet); try {sleep((long)Math.random() * FIVE_SECONDS); } catch (InterruptedException e) { } } catch (IOException e) { e.printStackTrace(); moreQuotes = false;} } socket.close();}

Différences principales Le DatagramPacket est construit à partir de de « ladresse de plusieurs clients » L adresse et le no de port sont câblés no de port 4446 (tout client doit avoir un MulticastSocket lié à ce no). Ladresse InetAddress " " correspond à un identificateur de groupe et non à une adresse Internet de la machine dun client Le DatagramPacket est destiné à tous les clients qui écoutent le port 4446 et qui sont membres du groupe " ".

Un nouveau Client Pour écouter le port 4446, le programme du client doit créer son MulticastSocket avec ce no. Pour être membre du groupe " " le client adresse la méthode joinGroup du MulticastSocket avec ladresse didentification du groupe. Le serveur utilise un DatagramSocket pour faire du broadcast à partir de données du client sur un MulticastSocket. Il aurait pu utiliser aussi un MulticastSocket. Le socket utilisé par le serveur pour envoyer le DatagramPacket nest pas important. Ce qui est important pour le broadcast est dadresser linformation contenue dans le DatagramPacket, et le socket utilisé par le client pour lécouter.

MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName(" "); socket.joinGroup(group); DatagramPacket packet; for (int i = 0; i < 5; i++) { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String received = new String(packet.getData()); System.out.println("Quote of the Moment: " + received); } socket.leaveGroup(group); socket.close();

Synthèse ClientServeur TCPaSocketaServerSocket connectéwriteread readwrite UDPaDatagramSocketaDatagramSocket non connecté sendreceive receivesend MulticastaMulticastSocketaDatagramSocket/ aMulticastSocket receivesend I/O Stream aDatagramPacket

Définir un nouveau type de socket Pourquoi ? Préparer les données avant de les envoyer Préparer les données reçues Exemple Java RMI Sockets spécialisées (marshalling et unmarshalling) Images : Compression et Décompression Comment ? En spécialisant les classes de base

Comment Définir un nouveau type de Sockets La classe CompressionSocket et ses classes relatives 4 étapes 1. Etendre java.io.FilterOutputStream pour créer un output stream pour ce type de Socket. Surcharge de méthodes si nécessaire. 2. Etendre java.io.FilterInputStream 3. Etendre java.net.Socket. Implémenter les constructeurs appropriés et surcharger getInputStream, getOutputStream et close. 4. Etendre java.net.ServerSocket Implémenter le constructeur et surcharger accept pour créer un socket du bon type.

Conclusion Une large bibliothèque pour traiter les sockets et différents types de communication entre Clients et Serveurs dans Java Des nouvelles entrées sorties : nio Une extension naturelle par abstraction à lappel de méthodes à distance - Java RMI et une normalisation Corba avec lintégration dun ORB et maintenant les EJB : Entreprise Java Beans et JINI …..