II. PRINCIPE DE
L'ARCHITECTURE CLIENT-SERVEUR
1. Architecture d'un client
L'architecture d'un programme réseau demandant les
services d'une application serveur sera la suivante :
ouvrir la connexion avec le service jeu de la machine
« serveur »
si réussite alors
tant que ce n'est pas fini
préparer une demande
l'émettre vers la machine
« serveur »
attendre et récupérer la réponse
la traiter
fin tant que
finsi
fermer la connexion
2. Architecture d'un serveur
L'architecture d'un programme offrant des services sera la
suivante :
ouvrir le service sur la machine locale
tant que le service est ouvert
se mettre à l'écoute des demandes de connexion
sur un port dit port d'écoute
lorsqu'il y a une demande, la faire traiter par une autre
tâche sur un autre port dit port de service
fin tant que
3. Quelques classes
Le framework .NET offre différentes classes
pour travailler avec le réseau :
· la classe Socket est celle qui
opère le plus près du réseau. Elle permet de gérer
finement la connexion réseau. Le terme socket désigne
une prise de courant. Le terme a été étendu pour
désigner une prise de réseau logicielle. Dans une communication
TCP-IP entre deux machines A et B, ce sont deux sockets qui
communiquent entre eux. Une application peut travailler directement avec les
sockets. C'est le cas de l'application A ci-dessus. Un socket peut
être un socket client ou serveur.
Si on souhaite travailler à un niveau moins fin que
celui de la classe Socket, on pourra utiliser les classes :
· TcpClient pour créer un client
Tcp,
· TcpListener pour créer un
serveur Tcp.
Ces deux classes offrent à l'application qui les
utilisent, une vue plus simple de la communication réseau en
gérant pour elle les détails techniques de gestion des
sockets.
.NET offre des classes spécifiques à certains
protocoles :
· La classe SmtpClient pour gérer
le protocole SMTP de communication avec un serveur SMTP d'envoi de courriers
électroniques
· La classe WebClient pour gérer
les protocoles HTTP ou FTP de communication avec un serveur web.
On retiendra que la classe Socket est suffisant en
elle-même pour gérer toute communication TCP/IP mais on cherchera
avant tout à utiliser les classes de plus haut niveau afin de faciliter
l'écriture de l'application TCP/IP.
a. La classe TcpClient
La classe TcpClient est la classe qui
convient dans la plupart des cas pour créer le client d'un service TCP.
Elle a parmi ses constructeurs C, méthodes M et propriétés
P, les suivants :
TcpClient(string hostname, int port) =>
C : crée une liaison tcp avec le service
opérant sur le port indiqué (port) de la machine
indiquée (hostname). Par exemple new
TcpClient("istia.univ-angers.fr",80) pour se connecter au port 80 de la
machine istia.univ-angers.fr
Socket Client => P : le
socket utilisé par le client pour communiquer avec le serveur.
NetworkStream GetStream() => M :
obtient un flux de lecture et d'écriture vers le serveur.
C'est ce flux qui permet les échanges client-serveur.
void Close() => M : ferme la
connexion. Le socket et le flux NetworkStream sont également
fermés.
bool Connected() =>
P : vrai si la connexion a été
établie.
b. La classe NetworkStream
La classe NetworkStream représente le
flux réseau entre le client et le serveur. Elle est
dérivée de la classe Stream. Beaucoup d'applications
client-serveur échangent des lignes de texte terminées par les
caractères de fin de ligne "\r\n". Aussi est-il intéressant
d'utiliser des objets StreamReader et StreamWriter pour lire
et écrire ces lignes dans le flux réseau.
c. La classe TcpListener
La classe TcpListener est la classe qui
convient dans la plupart des cas pour créer un service TCP. Elle a parmi
ses constructeurs C, méthodes M et propriétés P, les
suivants :
· TcpListener (int port) =>
C : crée un service TCP qui va attendre (listen) les
demandes des clients sur un port passé en paramètre (port)
appelé port d'écoute. Si la machine est
connectée à plusieurs réseaux IP, le service écoute
sur chacun des réseaux.
· TcpListener (IPAddress ip, int port) =>
C : idem mais l'écoute n'a lieu que sur l'adresse ip
précisée.
· void Start() => M :
lance l'écoute des demandes clients
· TcpClient AcceptTcpClient() =>
M : accepte la demande d'un client. Ouvre alors une nouvelle
connexion avec celui-ci, appelée connexion de service. Le port
utilisé côté serveur est aléatoire et choisi par le
système. On l'appelle le port de service. AcceptTcpClient rend
comme résultat l'objet TcpClient associé
côté serveur à la connexion de service.
· void Stop() => M
arrête d'écouter les demandes clients
· Socket Server => P le
socket d'écoute du serveur.
|