Lors d'une session de travail sous X, trois différentes stations de travail sont branchées en réseau sous UNIX. Un écran est physiquement branché à la station 1 et sur cet écran sont affichées 3 fenêtre X ; une représentant la station de travail 1, une autre représentant la station 2 et une dernière représentant la station 3.
Chaque programme ou application qui a au moins une fenêtre ouverte sur un écran donné (par exemple sur l'écran de la station 1) doit nécessairement être connecté au serveur qui contrôle cet écran, et devient donc automatiquement un client de ce serveur. Donc les trois fenêtre contenant chacune un 'shell' qui s'exécute sur trois stations différentes, mais qui affichent sur la station 1 sont toutes les trois des fenêtres appartenant à des clients du serveur X de la station 1. En plus de ces trois clients-là, il y a très probablement un window manager connecté au serveur de la station 1, qui est donc lui aussi client du serveur; 99.9% du temps, le window manager roule sur la même machine que le serveur (2 processus séparés sur la même machine), mais on pourrait imaginer une situation où le window manager roulerait sur une autre station. Dans un cas comme dans l'autre, le window manager est quand même un client du serveur X. Dans la situation décrite ci-haut, il y a donc 4 clients: 3 sont des terminaux roulant simplement un 'shell', et le quatrième est le window manager.
Pour rouler un client, ce n'est pas nécessaire qu'il y ait un serveur X qui roule sur la même machine; par contre, pour afficher sur un écran, c'est absolument nécessaire qu'il y ait un serveur X. Le serveur X contrôle l'écran de la machine sur laquelle il roule, si tout l'affichage se fait sur la station 1, il peut n'y avoir qu'un serveur sur la station 1 et pas sur les autres stations. Par contre, dès qu'on veut afficher sur l'écran d'une station, il faut qu'il y ait un serveur qui roule.
Non, les programmes peuvent rouler sur n'importe quelle machine, mais afficher sur l'écran de la station 1, par exemple, une fenêtre dans laquelle on peut entrer des commandes s'appelle un émulateur de terminal, cet émulateur peut rouler sur la station 2 ou 3 mais afficher sur la station 1. Ca permet à l'usager assis devant l'écran de la station 1 d'entrer des commandes qui seront exécutées sur les stations 2 ou 3. La particularité de la station 1, c'est qu'en plus de rouler un émulateur de terminal, elle roule aussi un programme qui est le serveur X, qui contrôle l'écran, auquel tous les autres programmes qui veulent afficher sur l'écran de la station 1 doivent s'addresser.
Non, les requêtes ne sont pas des programmes. Une requête est un message codé qu'envoie un programme à un autre programme en utilisant des mécanismes spécialisés du système d'exploitation. Il s'agit donc d'un échange de données entre deux programmes. Le programme client peut envoyer un message par exemple pour demander de tracer une ligne entre deux points, en disant au serveur: (TRACER LIGNE, point1, point2), le serveur reçoit ces données et exécute la requête du client.
Oui, un serveur X est opère toujours localement, il contrôle l'écran de la station sur laquelle il roule. Les clients peuvent rouler sur n'importe quelle machine et se connecter au serveur, mais le serveur, lui doit rouler sur la machine à laquelle l'écran est connecté. Si on veut afficher sur une autre station, il faut démarrer un autre serveur sur cette autre station.
Le principal avantage d'une architecture client-serveur est de faciliter l'arbitrage des conflits entre plusieurs clients qui veulent avoir accès à la même ressource. Dans le cas du serveur X, la ressource est l'espace d'affichage. En utilisant un serveur X, on permet à plusieurs programmes roulant simultanément (sur une ou plusieurs machines) de partager la surface d'affichage disponible. Aucun des clients ne prend le contrôle de l'écran en empêchant les autres clients d'y avoir accès. C'est une façon élégante de faire cohabiter plusieurs programmes qui veulent tous avoir accès à la même ressource. Un autre exemple serait un serveur d'impression, qui se chargerait d'arbitrer les requêtes de tous les usagers d'un laboratoire pour que chacun ait accès à l'imprimante à tour de rôle, en mettant toutes les requêtes dans une queue, et en les traitant à tour de rôle.