0% ont trouvé ce document utile (0 vote)
26 vues53 pages

Sockets TCP en Java : Guide Pratique

Transféré par

Ghizlan Fellah
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
26 vues53 pages

Sockets TCP en Java : Guide Pratique

Transféré par

Ghizlan Fellah
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd

Programmation

Réseau en Java :
Sockets TCP

M. OUZZIF
Socket TCP

• Le protocole TCP offre un service en mode connecté et


fiable.
• Les données sont délivrées dans l’ordre de leur
émission.
• La procédure d’établissement de connexion est
dissymétrique.
• Un processus, appelé serveur, attends des demandes
de connexion qu’un processus, appelé client, lui envoie.
• Une fois l’étape d’établissement de connexion
effectuée le fonctionnement redeviens symétrique.
Socket TCP
• C'est au client qu'incombe la tâche de la prise
de contact.
• Pour être en mesure de réagir au contact
initial du client, le serveur doit être disponible.
•  le logiciel serveur soit lancé et exploitable
en tant que processus :
– Il doit disposer d'une sorte de porte
– (l'interface de connexion) à laquelle le client vient
« frapper ».
Socket TCP
• Une fois le processus serveur activé:
– le processus client peut établir une connexion TCP avec
le serveur :
• fait par la création d'une interface de connexion dans le
logiciel client, au cours de laquelle le client est invité à
fournir l'adresse du processus serveur (adresse IP et numéro
d'accès).
• TCP entame ensuite un échange de présentation à
trois voies et établit la connexion TCP avec le
serveur.
• Procédure de prise de contact est totalement
transparente vis-à-vis des logiciels client et serveur.
Socket TCP
• Au cours de la procédure d'échange de présentation
– le processus client frappe à la porte d'entrée du processus serveur.
– Lorsque le serveur « entend» les « coups» sur la porte, il génère une
nouvelle voie d'accès (c'est-à-dire une nouvelle interface de
connexion) dédiée spécialement à ce client.
• la porte d'accueil est un objet ServerSocket appelé
welcomeSocket.
• Lorsqu'un client frappe à cette porte, le logiciel fait appel à la
méthode accept () du welcomeSocket, qui ordonne la création
d'une nouvelle porte.
• À la fin des présentations, une connexion TCP relie l'interface de
connexion du client à la nouvelle interface de connexion du
serveur.
• Du point de vue de l'application, la connexion TCP représente
un
Socket TCP
Socket TCP
• Point de vue de l'application
– la connexion TCP représente un conduit virtuel direct entre
l'interface du client et l'interface de connexion du serveur.
• Processus client :
– peut envoyer n'importe quel type d'octets au travers de son
interface.
• TCP garantit que le processus serveur les recevra dans
le bon ordre (via l'interface de connexion).
• les processus client et serveur peuvent respectivement
recevoir et envoyer des octets au travers de leurs
interfaces.
Socket TCP
• Notion de flux de données.
– Un flux de données (stream) est une séquence de
caractères sortants ou entrants au cours ou à l'issue d'un
processus.
• Il existe des flux entrants, et des flux sortants issus
de processus.
– Un flux entrant est associé à un périphérique d'entrée, tel
que le clavier ou une interface de connexion laissant
entrer des données en provenance de l'internet.
– Un flux sortant est associé à un périphérique de sortie,
tel que l'écran ou une interface de connexion laissant
passer des données en direction de l'internet.
Socket TCP – Exemple d’application
client/serveur
• Notre exemple de programmation d'interface de
connexion vise à :
• développer une application dans le cadre de laquelle:
– Un client lit une ligne en provenance de son périphérique
d'entrée normalisé (clavier) et envoie cette ligne au serveur via
son interface.
– Le serveur lit la ligne reçue au travers de son interface de
connexion.
– Le serveur convertit la ligne en majuscules.
– Le serveur envoie la ligne modifiée au client via son interface de
connexion.
– Le client lit la ligne modifiée reçue au travers de son interface et
l'affiche sur son périphérique de sortie normalisé (écran).
Socket TCP – Exemple d’application
client/serveur
Socket TCP – Exemple d’application
client/serveur : [Link]
Socket TCP
• Le logiciel TCPClient crée trois flux de données et une interface de
connexion
• L'interface de connexion est appelée clientSocket.
• Le flux de données inFromUser est un flux entrant pour le logiciel, donc
associé au périphérique d'entrée normalisé (le clavier).
• Lorsque l'utilisateur pianote sur son clavier, les caractères rejoignent le flux
• de données inFromUser.
• Le flux de données inFromServer est un autre flux entrant pour le logiciel,
associé cette fois à l'interface de connexion.
• C'est ce flux qu'utilisent les caractères en provenance du réseau.
• Enfin, le flux de données outToServer est un flux sortant du logiciel,
également associé à l'interface de connexion.
• Les caractères que le client envoie à destination du réseau rejoignent le
flux de données outTo-Server.
Socket TCP
import [Link].*;
import [Link].*;
• Les noms java. io et java. net font référence à des paquetages
Java.
• Le paquetage java. io contient différentes classes pour les
flux sortants et entrants.
– java. Io : contient les classes BufferedReader et DataOutputStream,
utilisées par le logiciel pour créer les trois types de flux de données
présentés ci-dessus.
• java. net : fournit des classes pour le support réseau, à savoir
les classes Socket et ServerSocket.
• L'objet clientSocket de ce logiciel provient de la classe
Socket.
Socket TCP
class TCPClient {
public static void main(String argv[]) throws
Exception
{……………. }
}
• La première ligne correspond au début d'un bloc
de définition de classe. Le mot clé class débute la
définition de classe pour la classe appelée
TCPClient.
Socket TCP
class TCPClient {
public static void main(String argv[]) throws Exception
{……………. }
}
• Une classe contient des variables et des méthodes,
insérées entre des accolades droites ou gauches qui
ouvrent et ferment le bloc de définition de classe.
• La catégorie TCPClient n'a pas de variable de classe
et elle ne compte qu'une seule méthode, la méthode
main ( )
Socket TCP
class TCPClient {
public static void main(String argv[]) throws
Exception
{……………. }
}
• Lorsque l'interpréteur Java exécute une application
il appelle tout d'abord la méthode « main » de
laclasse.
• Celle-ci appelle ensuite toutes les autres
méthodes nécessaires au fonctionnement de
l'application.
Socket TCP
• String sentence ;
• String modifiedSentence ;
• Lesdeux lignes précédentes font référence à des
objets de type String.
• L'objet sentence est la chaîne de données entrée
par l'utilisateur qui est envoyée au serveur.
• L'objetmodifiedSentence est la chaîne de
données reçue du serveur qui s'affiche sur
l'écran de l'utilisateur .
Socket TCP
BufferedReader inFromUser = new BufferedReader
(new InputStreamReader([Link])) ;
• génèrent l'objet de flux de données inFromUser
de type Buffered Reader.
• Le flux entrant est initialisé au moyen de
l'argument System. In :
– qui attache le flux au périphérique d'entrée
normalisé.
• La commande permet au client de liredu texte à
partir de son clavier.
Socket TCP
Socket clientSocket = new Socket('hostname', 6789);

• génère l'objet clientSocket de type Socket.


• Elle conduit également à l'établissement de la connexion TCP
entre le client et le serveur. La chaîne de données
• "hostname" doit être remplacée par le nom du serveur (par
exemple,
• "fling. seas. upenn. edu").
• Avant établissement de la connexion TCP, le client effectue une
recherche DNS pour obtenir l'adresse IP du serveur.
• Le nombre 6789 correspond au numéro d'accès.
• l'adresse IP du serveur et le numéro d'accès de l'application
sont les deux identifiants du processus serveur.
Socket TCP
DataOutputStream outToServer =new
DataOutputStream([Link]());
BufferedReader inFromServer =new
BufferedReader(new
inputStreamReader([Link]()));

• génèrent des objets de flux de données associés à


l'interface de connexion.
• Leflux de données outToServer déclenche le
processus de sortie du flux vers l'interface.
• Le flux de données inFrom-Server ouvre le processus
d'entrée en provenance de l'interface
Socket TCP
Socket TCP
sentence = [Link]();
• Cette formulation place une ligne de caractères
composée par l'utilisateur au sein
• de la chaîne de flux de données sentence. Celle-
ci continue de rassembler les
• caractères jusqu'à ce que l'utilisateur termine sa
ligne au moyen d'un retour chariot. Du
périphérique d'entrée, celle-ci rejoint alors le
flux de données inFromUser vers
• la chaîne de données sentence.
Socket TCP
[Link](sentence + '\n');
• Cette ligne insère la chaîne de données sentence
accompagnée d'un retour chariot
• dans le flux de données outToServer. La phrase
composée circule au travers de l'interface
• de connexion du client en direction du conduit
TCP. Le client se met ensuite en
• attente de caractères en provenance du serveur.
Socket TCP
modifiedSentence = [Link]();
• Lorsqu'un groupe de caractères arrive en
provenance du serveur, il traverse le flux de
• données inFromServer et il est intégré à la
chaîne de données modifiedSentence. Les
• caractères continuent à s'y accumuler jusqu'à la
fin de la ligne qui se termine par le
• signe du retour chariot.
Socket TCP
System. out. println ( "FROMSERVER" + modif
iedSentence) ;
• Cette ligne affiche à l'écran la chaîne de données
modifiedSentence renvoyée par le
• serveur.
[Link]();
• Cette dernière ligne ferme l'interface de
connexion et interrompt donc la connexion
• TCP entre le client et le serveur. Elle provoque
l'envoi d'un message du TCP client
• vers le TCP serveur
Application client/serveur : [Link]
Socket TCP
• Lelogiciel TCPServer a de nombreux points
communs avec le TCPClient. Dans l'analyse des
lignes de code du TCPServer. java qui suivent,
nous ne commenterons que les commandes se
distinguant de celles du TCPClient. java.
ServerSocket welcomeSocket = new ServerSocket
(6789) ;
• Cetteligne génère l'objet welcomeSocket, qui est
du type ServerSocket. Le welcome-Socket est
une sorte de porte qui attend qu'un client frappe
pour s'ouvrir (sur l'accès 789)
Socket TCP
Socket connectionSocket = welcomeSocket. accept ( ) ;
• génère une nouvelle interface de connexion, intitulée
connectionSocket (dontle numéro d'accès est identique), qui est
créée lorsqu'un client frappe à la porte du welcomeSocket.
• TCP établit ensuite un conduit virtuel directentre le clientSocket au
niveau du client et le connectionSocket au niveau du
• Serveur
• Le client et le serveur peuvent dès lors s'échanger des octets de
données, qui arriventà destination dans le bon ordre.
• Une fois le connectionSocket établi, le serveur peut rester attentif à
des requêtes d'autres clients pour l'application ayant Recours au
welcomeSocket.
• La version du programme retranscrite ici ne présente pas cette
fonction, mais quelques lignes suffiraient pour l'en doter. Le
programme génère
Socket TCP
capitalizedSentence = clientSentence. toUpperCase
() + '\ n' ;
• Cettecommande représente le coeur même de
l'application. Elle prend en effet la
• ligneenvoyée par le client, l'enrichit et lui ajoute
un retour chariot. Dans ce but, elle
• a recours à la méthode toUpperCase(). Toutes les
autres commandes sont d'ordre
• périphérique, et sont impliquées dans la
communication avec le client.
Socket TCP
• Côté serveur :
– on utilise deux sockets :
• l’un, appelé socket d’écoute : reçoit les demandes de
connexion
• l’autre, appelé socket de service, sert pour la
communication.
• Un serveur peut être connecté simultanément
avec plusieurs clients :
– on utilisera autant de sockets de service que de
clients.
Socket TCP
• 2 classes : Socket et ServerSocket
– ([Link] package)
• La classe Socket
– représente en Java les sockets utilisés côtés client ou
les sockets de service.
• La classe ServerSocket
– permet de créer des sockets qui attendent des
connections sur un port spécifié
– lors d’une connexion, ils retournent un Socket qui
permet de communiquer avec l’appelant.
Socket TCP : Classe Socket : Constructeurs
• public Socket (String hote, int port) throws
UnknownHostException, IOException
– crée un socket TCP et tente de se connecter sur le port indiqué
de l’hôte visé.
– Le premier paramètre de ce constructeur représente le nom
de la machine serveur.
– Si l’hôte est inconnu ou que le serveur de noms de domaine
est inopérant, le constructeur générera une
UnknownHostException.
– Les autres causes d’échec, qui déclenchent l’envoi d’une
IOException sont multiples :
• machine cible refusant la connexion sur le port précisé ou sur tous les
ports,
• problème lié à la connexion Internet,
Socket TCP : Ouvrir un socket demander à se
connecter
• Dans un client
Socket myClient;
try {
myClient = new Socket("Machine name", PortNumber);
}
catch (IOException e) {
[Link](e);
}

• Machine name : machine à laquelle on veut se connecter


• PortNumber port sur lequel tourne le serveur (> 1023)
Socket TCP : Classe Socket : Constructeurs

• public Socket (InetAddress addresse, int port)


throws IOException
– fonctionne comme le premier
– # prends comme premier paramètre une instance de la
classe InetAddress.
– Ce constructeur provoque une IOException lorsque la
tentative de connexion échoue
– # ne renvoie pas d’UnknownHostException puisque cette
information est connue lors de la création de l’objet
InetAddress.
Socket TCP : Classe Socket : Constructeurs
• public Socket(String hote, int port, InetAddress
addresseLocale, int portLocal) throws IOException
– Comme les deux précédents, ce constructeur crée un socket et tente
de se connecter sur le port indiqué de l’hôte visé.
– Le numéro du port et le nom de la machine sont fournis dans les deux
premiers paramètres et la connexion s’établit à partir de l’interface
réseau physique (choix d’une carte réseau sur un système possédant
plusieurs accès réseau) ou virtuelle (système multi-adresse) et du
port local indiqués dans les deux derniers paramètres.
– Si portLocal vaut 0, la méthode (comme les deux premières d’ailleurs)
choisit un port disponible (parfois appelé port anonyme) compris
entre 1024 et 65 535.
– Comme la première méthode cette méthode peut générer une
IOException en cas de problème de connexion et lorsque le nom
d’hôte donné n’est pas correct (il s’agit dans ce cas d’une
Socket TCP : Classe Socket : Constructeurs

• public Socket(InetAddress address, int port,


InetAddress addresseLocale, int portLocal) throws
IOException
• Identique à la précédente à la seule différence que
le premier paramètre est comme pour la seconde
méthode, un objet InetAddress.
Socket TCP : Méthodes informatives

• public InetAddress getInetAddress ()


– renvoie l'adresse Internet distante auquel le socket est
connecté
• public int getPort ()
– renvoie le port distant auquel le socket est connecté
• public InetAddress getLocalAddress ()
– renvoie l'adresse Internet local que le socket utilise.
• public int getLocalPort ()
– renvoie le port local que le socket utilise.
Socket TCP : Communication avec un socket

• public InputStream getInputStream () throws


IOException
• Cette méthode renvoie un flux d’entrées brutes
grâce auquel un programme peut lire des
informations à partir d’un socket.
• Il est d’usage de lier cet InputStream à un autre flux
offrant d’avantage de fonctionnalités (un
DataInputStream par exemple) avant d’acquérir les
entrées.
Socket TCP : Communication avec un socket

• Exemple d’utilisation :
– DataInputStream fluxEnEntree = new
DataInputStream([Link]());
Socket TCP : Communication avec un socket

• public OutputStream getOutputStream () throws


IOException
– renvoie un flux de sortie brutes grâce auquel un
programme peut écrire des informations sur un socket.
– Il est d’usage de lier cet OutputStream à un autre flux
offrant d’avantage de fonctionnalités (un
DataOutputStream par exemple) avant d’émettre des
données.
Socket TCP : Communication avec un socket

• Exemple d’utilisation de cette méthode :


– DataOutputStream fluxEnSortie = new
DataOutputStream([Link]());
Socket TCP : Fermeture d’un socket

• public void close() throws IOException


– Bien que Java ferme tous les sockets ouverts lorsqu’un
programme se termine, il est fortement conseillé de
fermer explicitement les sockets dont on n’a plus besoin
à l’aide de la méthode close.
– Une fois un socket fermé on peut toujours utiliser les
méthodes informatives, par contre toute tentative de
lecture ou écriture sur les « input/output streams »
provoque une IOException.
ServerSocket TCP : Constructeurs

• public ServerSocket (int port) throws IOException


– Ce constructeur crée un socket serveur qui attendra les
connexions sur le port spécifié.
– Lorsque l’entier port vaut 0, le port est sélectionné par le
système. Ces ports anonymes sont peu utilisés car le client
doit connaître à l’avance le numéro du port de destination.
– L’echec de la création se solde par une IOException (ou à
partir de Java 1.1 une BindException qui hérite de
IOException) qui traduit soit l’indisponibilité du port choisi
soit, sous UNIX, un problème de droits (sous UNIX les ports
inférieurs à 1024 ne sont disponibles que pour le super
utilisateur).
ServerSocket TCP : Constructeurs

• public ServerSocket (int port, int tailleFile) throws


IOException
– Ce constructeur permet en outre de préciser la longueur
de la file d’attente des requêtes de connexion.
– Si une demande de connexion arrive et que la file est
pleine la connexion sera refusée sinon elle sera stockée
dans la file pour être traitée ultérieurement.
– La longueur de la file d’attente par défaut (pour le
premier constructeur) est 50.
– Lorsque la valeur donnée est supérieure à la limite fixée
par le système, la taille maximale est affectée à la file.
ServerSocket TCP : Constructeurs

• public ServerSocket (int port, int tailleFile,


InetAddress adresseLocale) throws IOException
– Ce constructeur permet en outre de préciser l’adresse
Internet locale sur laquelle attendre des connexions.
– Ainsi on pourra choisir l’une des interfaces réseau de la
machine locale si elle en possède plusieurs.
– Si adresseLocale est à null le socket attendra des
connexions sur toutes les adresses locales (ce qui est
aussi le cas quand on utilise l’un des deux autres
constructeurs).
ServerSocket TCP : Accepter et fermer une
connexion

• public Socket accept () throws IOException


• Cette méthode bloque l’exécution du programme
serveur dans l’attente d’une demande de connexion
d’un client.
• Elle renvoie un objet Socket une fois la connexion
établie.
• Si vous ne voulez pas bloquer l’exécution du
programme il suffit de placer l’appel à accept dans
un thread spécifique.
ServerSocket TCP : Méthodes informatives

• public InetAddress getInetAddress ()


• public int getLocalPort ()
• Ces méthodes renvoient l'adresse Internet et le port
locaux sur lequel le socket attends les
• connexions.
Exemple – Programme Client
import [Link].*;
import [Link].*;
public class ClientEcho extends Object {
public static void main (String args[]) {
String reponse;
Socket leSocket;
PrintStream fluxSortieSocket;
BufferedReader fluxEntreeSocket;
try {
/* creation d’une socket et connexion à la machine marine sur le port
numéro 7 */
leSocket = new Socket(“NomMachine", 7);
[Link]("Connecté sur : "+leSocket);
Exemple – Programme Client
/* création d’un flux de type PrintStream lié au flux de sortie de la socket
*/
fluxSortieSocket = new PrintStream([Link]());
/* creation d’un flux de type BufferedReader lié au flux d’entrée de la
socket*/
fluxEntreeSocket = new BufferedReader(new
InputStreamReader([Link]()));
// envoi de données vers le serveur
[Link]("Bonjour le monde!");
// attente puis réception de données envoyées par le serveur
reponse = [Link]();
[Link]("Reponse du serveur : " + reponse);
[Link]();
} // try
Exemple – Programme Client

catch (UnknownHostException ex)


{
[Link]("Machine inconnue : "+ex);
[Link](); }
catch (IOException ex)
{
[Link]("Erreur : "+ex);
[Link]();
}
} // main
} // class
Exemple – Programme Client

catch (UnknownHostException ex)


{
[Link]("Machine inconnue : "+ex);
[Link](); }
catch (IOException ex)
{
[Link]("Erreur : "+ex);
[Link]();
}
} // main
} // class

Vous aimerez peut-être aussi