Université de Lille1
Les sockets java
N. Melab
melab@[Link]
Sockets DESS-ISIDIS
Plan
n Le modèle
n Sockets java
n Sockets C-UNIX BSD 4.X
Le modèle
n Sockets : interface (point de communication)
client/serveur utilisée à l’origine dans le monde
UNIX et TCP/IP
n Etendue aux PCs (Winsock) et mainframes
n Primitives pour le support de communications
reposant sur les protocoles (TCP/IP, UDP/IP)
n Les applications client/serveur ne voient les
couches de communication qu’à travers l’API
socket (abstraction)
Sockets DESS-ISIDIS
Sockets/OSI
Protocole Applicatif
Application cliente Application serveur
API Socket API Socket
UDP TCP UDP TCP
IP IP
Physique Physique
Rôle des sockets
n Connexion à une machine distante
n Envoi/Réception de données
n Fermeture d’une connexion
n Attachement à un port
n Acceptation d’une demande de connexion à un
port local
n Attente de demandes de connexion
Sockets DESS-ISIDIS
Notion de port
n Connexion réseau
* Adresseinternet de la machine
* Numéro du port
n Pourquoi les ports ?
* Sur une même machine, plusieurs services sont
accessibles simultanément (web, email, etc.)
* Points d’accès : ports logiques (65535)
* Rien à avoir avec les ports physiques (série et
parallèle)
Désignation des ports
n Port : numéro allant de 1 à 65535
n Les ports 1 à 1023 sont réservés aux services
courants : finger, ftp, http (80), SMTP (25),
etc.
n Fichier d’assignation de ports : /etc/services
Sockets DESS-ISIDIS
Adresse internet
n Connexion réseau
* Adresse internet de la machine
* Numéro : [Link]
n Désignation par des noms symboliques
* Association de noms symboliques aux adresses
numériques
* Domain Name System (ou DNS)
* Exemple : [Link] : [Link]
Sockets java
Sockets DESS-ISIDIS
Gestion des ports (adresses) en Java
n Classe InetAdress
* Dans [Link]
* Champs
ó hostName (exemple : [Link])
ó address (32 bits, exemple : [Link])
* Pas de constructeur
* 3 méthodes statiques
ó public static InetAddress InetAddress .getByName(String hote)
ó public static InetAddress[] InetAddress .getAllByName(String hote)
ó public static InetAddress InetAddress .getLocalHost()
n Classes Socket, SocketServer et SocketImpl
* getInetAddress()
Gestion des sockets
n Taxinomie
* Sockets TCP
ó Point à point : Socket, SocketServer, SocketImlp
* Sockets UDP
ó Point à point : DatagramSocket
ó Multi-point : MultiCastSocket
* Dans [Link]
Sockets DESS-ISIDIS
Sockets TCP
n Classe Socket
ò Connexion à une machine distante
ò Envoi/Réception de données
ò Fermeture d’une connexion
n Classe SocketServer
ò Attachement à un port
ò Acceptation d’une demande de connexion à un port
local
ò Attente de demandes de connexion
Classe Socket (1)
n Constructeurs
ò public Socket(String hote, int port) throws
UnknownHostException, IOException
ò public Socket(InetAddress hote, int port) throws IOException
ò public Socket(String hote, int port, InetAddress interface, int
portLocal) throws IOException
ò public Socket(InetAddress hote, int port, InetAddress
interface, int portLocal) throws IOException
ò protected Socket()
ò protected Socket(SocketImpl impl)
Sockets DESS-ISIDIS
Classe Socket (2)
n Information
ò public InetAddress getInetAddress()
ò public int getPort()
ò public int getLocalPort()
ò public InetAddress getLocalAddress()
n Envoi/Réception de données
ò public InputStream getInputStream() throws IOException
ò public OutputStream getOutputStream() throws IOException
n Fermeture
ò public synchronized void close() throws IOException
Classe Socket (3)
n Options
ò TCP_NODELAY
ó Données expédiées aussitôt que possible quelque soit leur taille
ó Méthodes setTcpNoDelay (boolean valid) et setTcpNoDelay()
ò SO_LINGER
ó Attente ou non avant de fermer une socket au cas où il reste des
données à envoyer
ó Méthodes setSoLinger (boolean valid, int secondes) et
getSoLinger()
Sockets DESS-ISIDIS
Classe Socket (4)
ò SO_TIMEOUT
ó Déclenchement d’exception si le délai spécifié est dépassé lors
de la réception de données
ó Méthodes setSoTimeout (int ms) et getSoTimeout()
n Exceptions
ò SocketException
ó BindException : port déjà utilisé ou le programme n’a pas le
droit de l’utiliser
ó ConnectException : hôte occupé ou aucun processus n’écoute sur
le port
ó NoRouteToHostException : dépassement de temps
Exercices
n Ecrire un programme qui :
ò se connecte au service daytime d’internet (port
numéro 13)
ò affiche la date et l’heure
n Ecrire un programme qui implémente le service
echo (port numéro 7) - Utiliser les options des
sockets
n Implémenter le protocole finger (port numéro 79)
Sockets DESS-ISIDIS
Classe ServerSocket (1)
n Rôle : standardiste
n Gestion d’une connexion
ò Création d’un nouvel objet ServerSocket affecté à un
port : constructeur ServerSocket
ò Attente de connextion : accept()
ò Echange d’informations : getInputStream() et
getOutputStream()
ò Clôture de la connexion par le client ou le serveur :
close()
ò Nouvelle attente
Classe ServerSocket (2)
n Prise en compte des connexions
ò Un thread par connexion
ò Dans ftp, un processus par connexion
ó Limite : 400 connexions
n Gestion des demandes de connexion
ò File d’attente gérée par le système
ó Taille = 50 par défaut mais peut être modifiée
Sockets DESS-ISIDIS
Classe ServerSocket (3)
n Constructeurs
ò public ServerSocket(int port) throws IOException,
BindException
ò public ServerSocket(int port, int taillefile) throws IOException,
BindException
ò public ServerSocket(int port, int taillefile, InetAddress
adresseAttache) throws IOException
ò protected ServerSocket()
n Prise en compte et clôture d’une connexion
ò public Socket accept() throws IOException
ò public void close() throws IOException
Classe ServerSocket (4)
n Information
ò public InetAddress getInetAddress()
ò public int getLocalPort()
n Options
ò SO_TIMEOUT
ó Doit être initialisé avant accept
ó Méthodes setSoTimeout (int ms) et getSoTimeout()
Sockets DESS-ISIDIS
Exercice
n Programmer le service daytime d’internet
ò Ne pas utiliser le port numéro 13 sauf si vous avez les
droits super-utilisateur
ò Utiliser un numéro de port supérieur à 1024
Protocoles TCP et UDP
n TCP
* Garantie d’arrivée dans l’ordre de paquets de données
* Fiabilité de transmission
* Lenteur des transmissions (http par exemple)
* Vu comme un «service téléphonique»
n UDP
* Arrivée dans le bon ordre non garantie
* Non fiabilité des transmissions
* Rapidité des transmissions
* Applications audio/vidéo
* Vu comme un «service postal»
Sockets UDP point-à-point
n Pas de différence de classe entre le client et le
serveur
n Deux classes Java dans [Link]
* DatagramPacket
* DatagramSocket
n DatagramPacket
* Assemblage des données en partance en datagrammes
* Extraction des données des datagrammes reçus
n DatagramSocket
* Envoi et réception des datagrammes UDP (objets
DatagramPacket)
Classe DatagramPacket (1)
n Constructeurs
* DatagramPacket destiné à la réception de données
( publicDatagramPacket(byte tampon[], int longueur)
( Réception des données dans tampon
( Longueur maximale : 65 507 octets
( Java remplit les champs de DatagramPacket : adresse IP de la
machine distante et le numéro de port concerné
* DatagramPacket destiné à l’envoi de données
( public DatagramPacket(byte tampon[], int longueur,
InetAddress ia, int port)
( Conseil : utiliser getBytes() de la classe String pour
transformer des chaînes de caractères en tableaux d’octets
Classe DatagramPacket (2)
Structure d’un datagramme
En-tête IP En-tête UDP Charge utile
...
4 octets 4 octets 2 octets 2 octets 2 octets 2 octets
Contrôle pour fiabilité
Longueur
Port destinataire
Port expéditeur
Hôte destinataire
Hôte expéditeur
Classe DatagramPacket (3)
n Information
* public int getPort()
( Numéro de port de provenance si datagramme reçu
( Numéro de port de destination si datagramme créé
localement
* public InetAddress getAddress()
( Adresse du hôte distant si datagramme reçu
( Adresse du hôte local si datagramme créé localement
Classe DatagramPacket (4)
n Information (suite)
* public byte[] getData()
( Tableau d’octets du datagramme
( Caractères ASCII : String s=new String([Link](), 0, 0,
[Link]());
( Caractères non ASCII : ByteArrayInputStream b=new
ByteArrayInputStream([Link](), 0, 0, [Link]());
* public InetAddress getLength()
( Taille en octets du datagramme
Classe DatagramSocket (1)
n Constructeurs
* DatagramSocket utilisé par le client
( public DatagramSocket() throws SocketException
( Ports de destination et de partance spécifiés dans le
datagramme (objet DatagramPacket)
* DatagramSocket utilisé par le serveur
( public DatagramSocket(int port) throws SocketException
( Remarque : les ports TCP et leurs équivalents UDP ne sont pas
liés i.e. un même numéro de port peut être associé à la fois à
une socket TCP et une socket UDP sans provoquer aucun
problème de conflit
* DatagramSocket utilisé par le serveur multi -adresse
( public DatagramSocket(int port, InetAdress ia) throws
SocketException
Classe DatagramSocket (2)
n Emission/Réception de datagrammes
* public void send(DatagramPacket dp) throws IOException
* public void receive(DatagramPacket dp) throws IOException
n Information
* public int getLocalPort()
*Numéro de port (anonyme et assigné par le système) sur lequel la
socket courante écoute
n Fermeture
* public void close()
n Option : SO_TIMEOUT
* public synchronized void setSoTimeout(int timeout) throws
SocketException
Exercices
n Ecrire un client UDP générique
ó Une classe qui permet au programmeur d’utiliser les sockets UDP
sans avoir à manipuler les datagrammes (pas de DatagramPacket)
n Ecrire un client UDP daytime
n Ecrire une application echo client/serveur UDP multi-
threadée
Sockets multi-point
n Communication multi-point : on s’adresse à un groupe
qu’on peut intégrer et quitter à sa guise
* Exemples : visio-conférence, radio, télévision, etc.
n Multi-point = compromis
* Multi-diffusion
* Point-à-point
n Caractéristiques
* Efficace car données dupliquées au moment opportun
* Basée sur l’utilisation de routeurs multi-point
n Applications
* Jeux réseau multi -utilisateurs, SGF distribués, calcul parallèle
& distribué, etc.
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Principe
Routeur
multi-point
Adresses et groupes multi-point (1)
n Adresse multi-point
ò Référence un groupe d’hôtes (groupe multi-point)
ò Rangée dans la classe D (4 premiers bits : 1110)
n Groupe multi-point
ò Plusieurs hôtes Internet partageant la même adresse multi -
point
ò Libre adhésion ou départ au/du groupe
n lnternet Assigned Number Autority (IANA) est
responsable de l’affectation des adresses mutli-point
ò Il en existe 80
ò Exemple : [Link] --> [Link] - Actualité
audio transmise en multi-point
Sockets DESS-ISIDIS
Adresses et groupes multi-point (2)
ò Liste exhaustive dans :
[Link]
n Il existe des routeurs multi-point (mrouteurs)
n Datagramme multi-point
TTL En-tête IP En-tête UDP Charge utile
1 octet
4 octets 4 octets 2 octets 2 octets 2 octets 2 octets
...
Contrôle pour fiabilité
Longueur
Port destinataire
Port expéditeur
Hôte destinataire
Time-To-Live (TTL)
n Définition
ò Portée d’un datagramme i.e. nombre de routeurs maximum par
lesquels un datagramme transite avant sa suppression
ò Réseau local : TTL=1, Région : TTL=16, Monde entier : TTL=127
n Utilisation
* TTL décrémentée à chaque passage dans un routeur
* TTL=0 : datagramme supprimé
Mise en œuvre des sockets multi-point
n Classe [Link]
ò Dérivée de la classe [Link]
n Constructeurs
ò public MulticastSocket() throws SocketException
ó Port assigné par le système
ó getLocalPort() : renvoie le numéro du port
ò public MulticastSocket(int port) throws
SocketException
Communication avec un groupe multi-point (1)
n Opérations possibles
ò Adhésion à un groupe
ò Echanger (Emettre/Recevoir) des données avec les
membres d’un groupe
ò Quitter un groupe
n Méthodes
ò public void joinGroup(InetAddress adrmultipt) throws
SocketException
ò public void leaveGroup(InetAddress adrmultipt)
throws SocketException
Communication avec un groupe multi-point (2)
ò Public synchronized void send(DatagramPacket dp,
byte ttl) throws IOException, SocketException
ò public void setInterface(InetAddress interface)
throws SocketException
ò public InetAddress getInterface() throws
SocketException
Exercices
n Programmer une taupe multi-point
ò Adhésion à un groupe multi-point
ò Boucle sur réception de données envoyées au
groupe
n Ecrire un expéditeur de données multi-point
ò Adhésion à un groupe multi-point
ò Envoi de données aux membres du groupe
ò Sortie du groupe