Sockets

Communication entre deux machines avec sockets en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Dans l'informatique, tout comme dans la société, existens des consommateurs et des producteurs. Ces premiers consomment ce que produisent ces derniers. Le plus souvent, le produit commun pour les deux sera un service. Pour le mettre en place en Java, on peut utiliser les sockets, disponibles dans le package java.net.

Qu'est-ce que c'est un Socket sous Java

Le socket est un point final dans la communication entre 2 programmes lancés dans un réseau. Il est lié à un numéro de port. Grâce à cela, Transmission Control Protocol (TCP) peut identifier l'application à qui les données envoyées par le client sont destinées. Le socket peut être identifié par la combinaison de son adresse IP et du numéro de port.

Les deux participants de la communication sont souvent un client et un serveur. D'habitude le premier envoie une requête et puis traite la réponse. Elle est retournée par le serveur, en fonction des données envoyées.

Le serveur tourne sur une machine spécifique. Il possède un socket qui est lié à un numéro de port précis. Le serveur attend alors que le client se connecte à lui. Ensuite il réagit en fonction des requêtes envoyées. Sa réaction est possible grâce à l'écoute du numéro de port.

Le client connaît donc le nom de l'hôte de la machine ainsi que le numéro de port qu'écoute le serveur. Le schéma de connexion peut donc se résumer à des étapes suivantes :

  1. Le serveur, lié à un numéro de port, est lancé. Il reste actif et vérifie à chaque fois si aucune nouvelle requête n'est lui est soumise.
  2. Le client prend connaissance de la localisation du serveur (le nom de l'hôte et le numéro de port). Il tente à établir la connexion.
  3. Le serveur reçoit la requête et assigne le client à un numéro de port local. Ce numéro sera utilisé pendant la connexion.
  4. Quand la demande est acceptée, le serveur récupère un nouveau socket. Ensuite son socket est attaché à l'adresse et au port du client. Le nouveau socket est récupéré pour pouvoir continuer à écouter le socket original.
  5. Du côté client, un socket est également créé pour faciliter la communication du client avec le serveur.

Exemple d'un socket en Java

Tout d'abord on va créer un serveur capable de traiter une seule requête du client et afficher à la fin les données reçues. Le voici :

afficher le code

Le code commence avec l'initialisation du serveur sur le port 1111. Ensuite on crée l'instance de la classe Socket qui joue le rôle du client qui communique avec le programme qui se connecte au serveur (SocketClient ci-dessous). Ensuite on effectue toutes les opérations standardes sur les données reçues par le serveur. Elles sont ensuite affichées sur l'écran. La connexion est alors terminée.

Et maintenant le code du client qui, aussi une seule fois, peut envoyer des données au serveur :

afficher le code

Le client demande d'abord à l'utilisateur de saisir son login. Cette chaîne de caractères est ensuite transféré au serveur grâce au streaming sortant de l'instance du Socket.

Après l'exécution du serveur d'abord et du client après, on verra :

java SocketServer
Server socket created
java SocketClient
Your login : bartosz
Connecting with login : bartosz
// SocketServer after receiving the data from SocketClient
Socket accepted
Receiving data from user : bartosz
Closing client connection
Closing server connection

Question-réponse dans sockets en Java

Modifiant maintenant notre code du paragraphe suivant afin qu'il puisse gérer les interactions entre le serveur et le client. La spécification du code est la suivante. Au tout début l'utilisateur déclenche la connexion au serveur. Celui-ci demande au client de taper un mot. Une fois ce mot tapé, le serveur répond avec le même mot, mais écrit de la dernière à la première lettre. Le serveur utilisera ainsi une connexion persistante.

Voici le code du serveur :

afficher le code

Et maintenant l'honneur au client :

afficher le code

Comment cela fonctionne ? Au début, quand le client se connecte, le serveur répond avec "> Connected". Le client lit alors ce message et la console affiche le message "Your message :". Quand le client introduit et valide son texte, ce dernier est envoyé au serveur avec output.writeObject(). Le serveur le récupère alors avec in.readObject(). Le serveur transforme le message et renvoie la transformation au serveur. Tant que le message envoyé est différent de "q", la conversation continue.

Thread safety des sockets en Java

Bartosz KONIECZNY Classes

Une question ? Une remarque ?

*

*

Un conseil PHP

Fonctions dynamiques.

PHP permet de construire des fonctions à partir des variables. On peut très simplement construire une méthode dynamique qui génère une image en fonction du type de fichier transféré :

// filename has only alphanumerical caracters
$names = explode('.', $_FILES['image1']['name']);
$fname = "imagecreatefrom".$names[1];
$fname('fileOne');