TP 2 – Sockets

Exercice 1

On cherche à créer un serveur de date. C’est probablement le type de serveur le plus simple qui soit.

1. Créer une classe DateServer, qui ouvre un ServerSocket pour écouter un port donné, et répond « TOUCHÉ » lorsqu’elle reçoit une connexion sur ce port.

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class DateServer01 {
	private static int PORT = 9090;
	
	public static void main (String args[]) {
		ServerSocket listener=null;
		Socket socket;
		try {
			listener=new ServerSocket(PORT);
			System.out.println("Serveur en attente sur le port "+PORT);
			while (true) {
				socket=listener.accept();
				System.out.println("Recu une connection sur le port "+PORT);
				socket.close();
			}
		} catch (IOException e) {
			System.err.println("Impossible d'écouter le port "+PORT);
		}
		System.out.println("Fin de programme");
	}
}

2. Tester ce serveur avec Telnet.

3. Une fois la connexion établie envoyer la date sur le socket. Puis tester de nouveau avec Telnet. De même essayez de tester les serveurs de vos camarades.

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class DateServer02 {
	private static int PORT = 9090;
	
	public static void main (String args[]) {
		ServerSocket listener=null;
		Socket socket;
		try {
			listener=new ServerSocket(PORT);
			System.out.println("Serveur en attente sur le port "+PORT);
			while (true) {
				socket=listener.accept();
				System.out.println("Recu une connection sur le port "+PORT);
				
				PrintStream out=new PrintStream(socket.getOutputStream());
				out.println("La date est : "+(new Date()));				
				out.close();
				
				socket.close();
			}
		} catch (IOException e) {
			System.err.println("Impossible d'écouter le port "+PORT);
		}
		System.out.println("Fin de programme");
	}
}

4. Implémenter un client capable d’aller lire une heure sur ce serveur et de l’afficher (en ligne de commande).

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class DateClient {
	private static int PORT = 9090;
	private static String SERVER = "localhost";
	
	public static void main (String args[]) {
		Socket socket;
		try {
			socket=new Socket(SERVER,PORT);

			BufferedReader input=new BufferedReader(
					new InputStreamReader(socket.getInputStream()));

			String answer=input.readLine();
			System.out.println("Le serveur a dit : "+answer);

			input.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

5. Implémentez une petite application cliente SWING, qui affiche l’heure lue sur le serveur, avec un bouton de mise à jour. Deux champs de texte permettront de donner l’adresse du serveur et son port.

Exercice 2

Il s’agit de réaliser un programme permettant de jouer au « Morpion » à 2 joueurs via le réseau. On considère le jeu standard du morpion à 9 cases, dans lequel chaque jouer essaye de réaliser une ligne, horizontale, verticale ou en diagonale.

Le principe est de construire 2 applications : d’une part un serveur dont le rôle est d’attendre les connexions des joueurs, puis de les faire jouer ensemble, et d’autre part une application SWING qui affiche sur la machine de chaque joueur l’état du jeu et lui permet de jouer lorsque c’est son tour.

1. Quelles sont les tâches qui doivent être implémentée au niveau du serveur ? des clients ?

2. Une méthode élégante consiste à commencer par décrire un protocole de communication (qu’on pourrait appeler OMCP pour Online Morpion Communication Protocol). Proposer un tel protocole.

Protocole OMCP // Online Morpion Communication Protocol :-)
Séparateur : EOL

Client -> Serveur
OMCP // shake hands
NAME [A-Za-z0-9] // Envoi du nom du joueur
PLAY [0-8] // Joue la case n
CANCEL // Le joueur abandonne

Serveur -> Client
WELCOME [XO] // Connection acceptée et attribution de la marque du joueur
FULL // Connection refusée, il y a déjà 2 joueurs
ERROR // Connection refusée, protocole incorrect (pas reçu OMCP)
OTHERNAME // Envoie le nom de l'autre joueur
HAND // Donne la main à un joueur
VALID // Le coup joué est valide
WRONG // Le coup joué est impossible
OTHERPLAY [0-8] // L'autre joueur a joué en case n
WIN // Le joueur à gagné
LOST // Le joueur à perdu
TIE // Match nul
OTHERCANCEL // L'autre joueur a abandonné ou sa connection a été perdue

3. Voici la partie serveur. A vous d’implémenter le client SWING.

4. Les joueurs aimeraient bien pouvoir communiquer par chat en même temps. Qu’est-ce que cela implique ?

5. On voudrait que plusieurs joueurs puissent se connecter en même temps, et se lancer des défis. Le serveur devrait pouvoir gérer plusieurs parties en même temps. Quelles seront les modifications à apporter ?

 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.