But du TP :
Notre TP a pour but l'implémentation d'une communication client-serveur en mode TCP et la récupération des résultats envoyés par le serveur pour les afficher sur l'écran.Plus concrètement ,nous disposons d'un ensemble de machines interconnectés entre eux par un réseau de communication, et nous voulons obtenir par envoi de requête à partir d'un ordinateur « Hôte » les résultats (ou diagnostics ) effectuées par les machines visées. Ce résultat va être sous format numérique correspondant a une panne bien précise. Ce numéro va être décoder pour obtenir une description complète de l'état de la machine distante et cela par la consultation d'une base de donné implémenté coté Client qui contiendra tous les numéros et les descriptions correspondantes. Les résultats obtenues seront affichés sur l'écran dans une interface Client conçu spécialement pour ce TP.
La notion de Socket :
La notion de sockets a été introduite dans les distributions de Berkeley (un fameux système de type UNIX, dont beaucoup de distributions actuelles utilisent des morceaux de code), c'est la raison pour laquelle on parle parfois de sockets BSD (Berkeley Software Distribution). Il s'agit d'un modèle permettant la communication inter processus (IPC - Inter Processus Communication) afin de permettre à divers processus de communiquer aussi bien sur une même machine qu'à travers un réseau TCP/IP . La communication par socket est souvent comparée aux communications humaines. On distingue ainsi deux modes de communication:
- Le mode connecté (comparable à une communication téléphonique), utilisant le protocole TCP . Dans ce mode de communication, une connexion durable est établie entre les deux processus, de telle façon que la socket de destination n'est pas nécessaire à chaque envoi de données.
- Le mode non connecté (analogue à une communication par courrier), utilisant le protocole UDP . Ce mode nécessite l'adresse de destination à chaque envoi, et aucun accusé de réception n'est donné.
Communication par Sockets :
Connexion Client/Serveur: L'instruction : Socket (String hôte, int port ); ouvre une socket , qui est en fait une abstraction du programme de réseau qui permet d'établir une communication en entrée et en sortie avec ce programme. L'adresse de l'ordinateur distant est passée au constructeur de la socket avec le numéro du service désiré. Si la connexion ne peut pas être ouverte, une UnknowHostException est déclenchée. Si une autre erreur survient, une IOException apparaît. Une fois que la socket est ouverte, les méthodes getOutputStream et getInputStream de java.net.Socket renvoient respectivement les objets OutputStream et InputStream que vous pouvez utiliser comme n'importe quel autre fichier. Au travers de ces deux objets, respectivement :
| java.net.Socket |
| Socket (String hôte, int port ); |
Crée une socket et la connecte à un port de l'ordinateur distant. |
| void close (); |
Ferme la socket. |
InputStream getInputStream (); |
Récupère le flot de données à lire sur la socket. |
OutputStream getOutputStream (); |
Récupère le flot de données à écrire sur la socket. |
void setSoTimeout (int délai ); |
Définit la valeur de temps d'attente lors de l'ouverture d'une socket. Si ce délai est écoulé, cela veut dire que la connexion n'a pas pu s'établir et une InterruptedIOException est déclenchée. Ce système permet d'éviter d'attendre indéfiniment. |
La classe java.net.ServerSocket permet de monter un service. Cette classe est ensuite utilisée pour établir une socket. La méthode accept demande au programme d'attendre indéfiniment jusqu'à ce qu'un client se connecte sur ce port. Une fois qu'un ordinateur s'y est connecté en envoyant une requête adéquate sur le réseau, cette méthode renvoie un objet Socket qui représente la connexion établie. Vous pouvez vous servir de cet objet pour lire et pour écrire au travers de cette socket. Tout ce que le serveur envoie à son flux de sortie devient un flux d'entrée pour le programme client, et toutes les sorties du client deviennent les entrées du serveur.
| java.net.ServerSocket |
| ServerSocket (int port ) throws IOException ; |
Crée une socket de serveur qui examine un port. |
| Socket accept () throws IOException ; |
Attend une connexion. Cette méthode bloque le thread courant jusqu'à ce que la connexion soit établie. Cette méthode renvoie un objet Socket grâce auquel le programme peut communiquer avec le client. |
| void close () throws IOException ; |
Ferme la socket du serveur. |
Architecture client/serveur à trois niveaux :
C'est l'architecture sur laquelle notre projet est basé, en fait elle est plus parfaite pour la séparation entre Client et Serveur. En effet, Le client n'accède jamais directement au serveur. Il émet des requêtes à un serveur d'application qui exécute les traitements et transmet les requêtes au serveur(s) visé(s). (Voir Fig. ci-dessous) On parle alors d' architecture à 3 niveaux (ou tiers) : - Client : où est placée la couche présentation (interface homme/machine) - Serveur d'application : on y trouve l'ensemble des traitements applicatifs séparés des données physiques. - Serveur : il fait le diagnostic de la machine et attend une requête du Serveur d'application pour lui envoyer les résultats du diagnostic.
Description approfondie de l'application :
Notre application ,comme nous l'avons déjà dis est composé de trois parties ou trois sous application : Client, Serveur intermédiaire(ou serveur d'application) et Serveur ; En fait l'utilisateur va établir une connexion à partir de la machine Hôte qui est la machine Client en saisissant l'adresse IP de la machine intermédiaire ;
Après que la connexion soit établie il va envoyé des requêtes au serveur d'application qui va a son tour interroger ou consulter l'état des machines a diagnostiquer .
L'application Serveur installé sur ces dernières(machines) --après avoir faire le diagnostic-- va retourner un résultat(un nombre) décrivant leur états. Ce résultat ,après consultation de la base de donné va être affiché sous forme de commentaire.
|