Bas de page
Page précédente Sommaire Page suivante
Bas de page

IV) LES API JAVA

5) Java un langage orienté réseau

5-1) Le World Wide Web

Internet est un réseau de réseaux. Il est né dans les laboratoires de recherche de l’armée américaine dans les
années soixante. La mission assignée aux chercheurs était de trouver un modèle de réseau d’information qui
permettrait de communiquer partout dans le monde de manière rapide et robuste. Il était entendu, à l’époque, par
robuste que si une partie du réseau était « effacée » (attaque nucléaire…), l’information devrait continuer à
circuler sans en être affectée. Ce besoin est à l’origine de l’architecture actuelle d’Internet.

La solution technique à ce problème fut apportée par le protocole TCP/IP développé par le DARPA vers le
milieu des années soixante–dix.
Les choses commencèrent à s’accélérer en 1979, quand le DARPA créa un comité de coordination, le ICCB, qui
regroupait non seulement des chercheurs de l’armée mais aussi un nombre croissant de chercheurs universitaires
passionnés par le protocole TCP/IP. Le DARPA entama la conversion de toutes les machines dédiées à la
recherche au protocole TCP/IP en 1980. C’est à cette date qu’Internet, tel que nous le connaissons, a réellement
commencé à exister.

En 1983, le bureau du secrétariat de la défense rendit obligatoire pour toutes les machines et serveurs connectés
aux réseau grande distance l’emploi des protocoles TCP/IP, cela impliquait donc la migration complète de tous
les réseaux vers Internet. Cette même année, Arpanet (ancien nom d’Internet) fut scindé en deux réseaux
distincts, l’un destiné à la recherche (qui conserve le nom d’Arpanet), l’autre destiné aux militaires (Milnet).Les
différentes aides financières que le DARPA fournit aux universités (Berkeley…) impliqua la migration vers
TCP/IP de plus de 90 % des ordinateurs des universités américaines.

En 1986, la National Science Fondation créa un réseau longue distance, le NFSNET, destiné à relier tous ses
centres de calculs et se connecter à Arpanet. Tous ces réseaux interconnectés entre eux forma l’Internet auquel se
sont ajoutés petit à petit de nouveaux réseaux.

Actuellement, il est possible de définir le World Wide Web comme un système d'information Hypermédia réparti,
fonctionnant en mode client/serveur. Les clients communiquent avec des serveurs pour charger et/ou échanger
des documents contenant des textes, des images, des images animées et des sons.

Le World Wide Web s'appuie sur un schéma d'identification des ressources de l'Internet (les URL) ainsi que sur
deux protocoles, d’une part le HTTP qui assure les échanges d’information entre serveurs et clients, d’autre part
le HTML qui est un protocole de présentation des documents.

Sur Internet, comme dans une grande partie des réseaux informatiques, il existe de nombreux protocoles. Mais le
protocole universellement utilisé est TCP au-dessus de IP, qui sont regroupés aujourd'hui sous le nom de TCP/IP,
voir l’historique ci-dessus. Les couches supérieures font appel à d'autres protocoles. Parmi ces protocoles on peut
citer entre autres :

_HTTP pour des requêtes sur un document d’un site
_FTP pour la transmission de fichiers entre deux systèmes
_SMTP qui définit le service de base en matière de courrier électronique

Tous ces protocoles permettent le dialogue entre des machines possédant des systèmes d'exploitation différents et
des architectures hétérogènes.

5-2) Le protocole IP


5-2-1) Définition

Le protocole IP est la base du succès technique d'Internet. Intermédiaire entre l'application et le support physique,
il permet l'indépendance du réseau physique qui peut être de type Ethernet, FDDI, LocalTalk. IP se charge de la
construction ainsi que du transport des paquets de données circulant sur le réseau. Cependant, il faut se prémunir
de certains a priori car IP ne garantit en aucun cas la livraison ou l’ordre d’arrivée des paquets. IP se contente
d’acheminer les paquets de données vers la machine ciblée et de les restituer tels qu’il les a reçus.

Figure 5 : hiérarchie OSI des principaux protocoles présents dans Java

Le modèle ISO/OSI (International Standards Organization/Open Systems Interconnection) est une conception à
7 couches (physique, liaison, réseau, transport, session, présentation, application) qui constitue une approche
modulaire. Le modèle sur lequel nous travaillons en général est un modèle un peu simplifié où :
??Physique : Ethernet, Token Ring ;
??Liaison : circuits, ` a paquets
??Réseau : IP, IDP, ICMP, ARP
??Transport : TCP, UDP
??Application : SMTP, TFTP, FTP, TELNET, HTTP
Les ports permettent sur une même machines d'adresser différents services. Les ports de services sont codés sur
16 bits. D'un manière générale, les ports < 1024 sont réservés pour l’administrateur et les services attachés au système dans ce qu'il à d'essentiel. En revanche, les ports >= 1024 sont utilisables par les utilisateurs (où les
applications utilisateurs : SGBD, serveurs applicatifs…). Les principaux services sont appelés par des alias sont
UNIX et sont répertoriés dans le fichier : /etc/services. Voici une liste de quelques ports logiques attribués
à des services classiques :

echo 7/tcp
echo 7/udp
discard 9/tcp
discard 9/udp
systat 11/tcp
daytime 13/tcp
netstat 15/tcp
chargen 19/tcp
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp
time 37/tcp
time 37/udp
name 42/tcp
whois 43/tcp
dns 53/udp
dns 53/tcp
finger 79/tcp
http 80/tcp
pop 110/tcp
auth 113/tcp
nntp 119/tcp
imap 143/tcp
exec 512/tcp
login 513/tcp
who 513/udp
shell 514/tcp
syslog 514/udp
talk 517/udp
route 520/udp
timed 525/udp
...


Les IP en IP V4 sont des entiers de 32 bits (4 octets) écrits en décimal par octet. Par exemple :
192.48.98.1 = 0xC0306201.
Il existe quatre classes d’adresses qui sont attribuées en fonction de la taille du réseau :
_Classe A ( 0x70000000)
_Classe B ( 0x80000000)
_Classe C ( 0xC0000000)
_Classe D ( 0xE0000000)
Il faut aussi savoir qu'il existe des plages d'adresses réservées pour les Intranets qui sont destinés à être reliés à
l'Internet (c'est-à-dire tout réseau actuel). Ces plages sont précisées dans la dernière RFCsur IP à laquelle il
faudra impérativement vous référer en cas d'implémentation d'un réseau local ou non.

5-2-2) Les adresses IP en Java

La classe java.net.InetAddress permet de manipuler les adresses Internet. Il n'existe pas de constructeur.
Pour obtenir une instance de cette classe il est nécessaire d'utiliser des méthodes statiques dela classe.
Ces méthodes de classe sont les suivantes :
_ public static InetAddress getLocalHost()
throws UnknownHostExeception :
retourne un objet contenant l'adresse Internet locale ;
_ public static synchronized InetAddress getByName(String host_na me)
throws UnknownHostExeception :
retourne un objet contenant l'adresse Internet de la machine dont le nom est passé en paramètre ;
_ public static synchronized InetAddress[] getAllByName(String
host_name)
throws UnknownHostExeception :
retourne un tableau d'objets contenant l'ensemble des adresses Internet de machines qui répondent
au nom passé en paramètre.
Les méthodes que l'on peut appliquer à un objet de cette classe sont :
_ public String getHostName () :
retourne le nom de la machine dont l'adresse est stockée dans l'objet.
_ public byte[] getAddress () :
retourne l'adresse Internet stockée dans l'objet sous forme d'un tableau de 4 octets dans l'ordre
réseau.
_ public String toString () :
retourne une chaîne de caractères qui liste le nom de la machine et son adresse.

Exemple :

InetAddress adresse = InetAdress.getLocalHost ();
System.out.println(adresse);


5-3) Le protocole TCP

5-3-1) Définition

TCP procure un service de communication fiable entre applications, c'est un protocole complémentaire de IP.
Après avoir acheminé l'information vers la machine ciblée (IP), il s'agit ici d'atteindre l'application référencée.
Les principes de base du protocole TCP sont :

_Protocole de transport fiable
_Contrôle d'erreurs (détection et reprise)
_Contrôle de flux
_Protocole garantissant l'ordre des données
_Notion de connexion
_Protocole orienté flot de données
_Multiplexage

Le principal avantage du protocole TCP est la sécurité. En effet le protocole TCP fait des détections et reprises
sur les paquets erronés ou perdus. TCP établit un circuit virtuel entre applications distantes et introduit pour cela
la notion de numéro de port. Sur la plupart des machines connectées, plusieurs applications se déroulent
simultanément; par le biais des numéros de port, TCP joue le rôle d'un multiplexeur d'applications. Il assure
également la fiabilité de la transmission (remise en ordre des paquets, retransmission des paquets perdus, etc.).
Les applications construites sur le modèle client/serveur utilisent (en général) TCP pour mettre en
communication des processus éloignés.
Une fois l'information acheminée chez le destinataire par le protocole IP, il faut atteindre l'application référencée,
c'est le rôle du protocole TCP.

5-3-2) Les sockets TCP

L'API utilisée pour accéder au protocole TCP se décompose en deux classes, une utilisée par les clients et l'autre
par les serveurs.

5-3-2-1) La classe Socket

La classe Socket est utilisée par les clients TCP. Pour créer un objet de la classe Socket, il est nécessaire
d'utiliser un des constructeurs suivant :

public Socket (String machine, int port) throws UnknownHostException,
IOException
public Socket (InetAddress adresse, int port) throws UnknownHostException,
IOException
public Socket(String machine, int port,
InetAddress local, int portLocal) throws IOException
public Socket(InetAddress adresse, int port,
InetAddress local, int portLocal) throws IOException


La création de cet objet entraîne la création d'un point de connexion (la socket) et la connexion vers une autre
socket (le serveur). L'adresse du serveur est composée de l'adresse d'une machine (sous forme d'un nom ou
d'un objet de la classe InetAddress) et d'un numéro de port. L'adresse locale et le port local peuvent
également être spécifiés. Par défaut, l'appel au constructeur est bloquant tant que la connexion TCP n'est pas
établie.
Une fois la connexion établie, il est possible de récupérer le flux d'entrée et le flux de sortie de la connexion TCP
vers le serveur au moyen des méthodes :

public InputStream getInputStream () throws IOException
public OutputStream getOutputStream () throws IOException

Il est alors possible d'échanger des données avec le serveur au moyen de toutes les primitives de lecture et
d'écriture des différentes classes du package java.io.

Par défaut les primitives de lecture, tel que read(), sont bloquantes tant que rien n'est lisible sur le flux. La
primitive suivante permet de définir un temps maximal d'attente :

public synchronized void setSoTimeout(int timeout) throws SocketException

Une fois la connexion terminée il est très important de fermer le flux d'entrée et le flux de sortie, mais aussi la
socket au moyen de la méthode :

public synchronized void close () throws IOException

Par défaut cette primitive n'est pas bloquante mais la socket reste ouverte tant qu'il reste des paquets à envoyer
(en particulier le datagramme FIN). La primitive suivante permet de définir un temps maximum d'attente avant
de vraiment fermer la socket.

public void setSoLinger(boolean on, int val) throws SocketException

Par défaut, les implémentations du protocole TCP essaye de remplir au maximum chaque paquet (Nagle
algorithm) afin de diminuer le trafic réseau. Pour éviter ce comportement, ce qui est souvent souhaitable dans le
cas d'application interactives une primitive est disponible.

public void setTcpNoDelay(boolean on) throws SocketException

D'autres méthodes sont également disponibles et en particulier :

public InetAddress getInetAddress ()
public int getPort ()
public InetAddress getLocalAddress ()
public int getLocalPort ()
int getLocalPort ()
public int getSoLinger() throws SocketException
public synchronized int getSoTimeout() throws SocketException
public boolean getTcpNoDelay() throws SocketException


Remarque : une Applet ne peut (pour des questions de sécurité) se connecter qu'à la machine depuis laquelle elle
a été chargée.

Exemple :

import java.io.*;
import java.net.*;
public class SmtpClient
{
public static void main(String argv[]) throws Exception
{
sendmail("aaa"," odepertat@gfi-info.fr ");
}
static void sendmail(String message, String to)
throws Exception
{
Socket s = new
Socket(InetAddress.getByName("gfi-info.fr"),25);
PrintStream output = new PrintStream(s.getOutputStream());
output.println("HELO de3i \r");
output.println("MAIL FROM: <odepertat@gfi-info.fr\r");
output.println("RCPT TO:<" + to + ">\r");
output.println("DATA\r");
output.println(message);
output.println("\r\n.\r");
}
}


5-3-3) La classe ServerSocket

Cette classe est utilisée (comme son nom l'indique) pour créer une socket du coté serveur. La classe
ServerSocket permet de créer un point de communication, sur un port particulier, en attente de connexions
en provenance de clients. Contrairement à la classe Socket elle n'ouvre pas de connexion. Pour créer un tel
objet, il faut utiliser un des constructeurs suivants, où port correspond au port d'attente et count au nombre
maximum de connexions en attente, non encore acceptées.

public ServerSocket(int port) throws IOException
public ServerSocket(int port, int count) throws IOException
public ServerSocket(int port,int count, InetAddress locale) throws
IOException


Une fois la socket créée, on attend les connexions de clients avec la méthode bloquante :

public Socket accept() throws IOException

Il est possible de spécifier un temps maximal d'attente. Pour cela il faut appeler la méthode suivante avant l'appel
à accept() :

public synchronized void setSoTimeout(int timeout) throws SocketException

Cette méthode retourne un nouvel objet de la classe Socket qui est connecté avec le client qui a demandé la
connexion. Il est alors possible de récupérer le flot d'entrée et de sortie comme pour le socket du client.
D'autres méthodes de manipulation sont également disponibles :

public void close() throws IOException
public int getLocalPort()
public InetAddress getInetAddress()
public synchronized int getSoTimeout() throws IOException


5-3-4) Exemple client/serveur avec les classes ServerSocket et Socket

5-3-4-1) Le code du serveur

import java.net.*;
import java.io.*;
public class SimpleServer
{
boolean runSw=true;
public SimpleServer ()
{
try
{
ServerSocket srv = new ServerSocket(6420);
int num = 0;
String responseBuffer;
System.out.println("Server started !");
do
{
Socket client = srv.accept( ); //waiting for an incoming client
DataInputStream instream =
new DataInputStream(client.getInputStream());
DataOutputStream outstream =
new DataOutputStream(client.getOutputStream());
num++;
responseBuffer = instream.readLine();
if (responseBuffer.startsWith("stop"))
runSw = false;
System.out.println("A client sent : " + responseBuffer);
outstream.writeBytes("You were client number : " + num);
client.close();
} while(runSw);
}
catch (IOException e) { System.out.println(e.getMessage()); }
}
public static void main(String arg[]) { new SimpleServer(); }
}


5-3-4-2) Le code du client

import java.net.*;
import java.io.*;
public class JavaClient
{
public JavaClient(String message)
{
try
{
System.out.println("About to acquire Host");
InetAddress ipaddr = InetAddress.getLocalHost();
System.out.println("HostAddress="+ipaddr.toString());
Socket srv = new Socket(ipaddr, 6420);
System.out.println("Return from building Socket");
DataOutputStream outstream = new
DataOutputStream(srv.getOutputStream()); //voie out
DataInputStream instream = new DataInputStream(srv.getInputStream());
//voie in
outstream.writeBytes(message + "\n");
System.out.println("Recieved from server : " + instrea m.readLine());
srv.close();
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String args[])
{
if (args.length > 0)
{
new JavaClient(args[0]);
}
else
{
System.out.println("Usage : java JavaClient <msg>");
System.out.println("\n");
System.out.println(" java JavaClient stop : stops the server");
}
}
}



Haut de page
Page précédente Sommaire Page suivante
Haut de page
Contactez-nous
Conditions d'utilisation
Qui sommes nous?
© 2001 IsepFAQtory Tous droits réservés