Communication en mode connecté modèle poste à poste                  

Communication en mode connecté modèle poste à poste

     

Ce modèle est illustré avec un exemple plus simple. Il s'agit de faire un programme pour établir une communication en mode connecté entre deux machines ; deux personnes peuvent communiquer d'une machine à une autre ; chacune des personnes peut exécuter le programme qui nous sert d'exemple en indiquant sur la ligne de commande le nom de la machine avec laquelle il souhaite communiquer. Le programme fonctionne quelle que soit celle des deux personnes qui lance en premier le programme mais nécessite que chaque personne sache que l'autre souhaite communiquer avec elle à partir d'une certaine machine dont elle doit indiquer le nom. Lorsque la connexion est établie, les personnes envoient et reçoivent les messages à l'aide de la fenêtre d'exécution. Les méthodes Java utilisées sont les mêmes que dans le paragraphe précédent. Dans un « vrai » programme, il faudrait traiter plus en détail les exceptions


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

class Recepteur extends Thread  {
	Socket socket;

	Recepteur(Socket socket)  {
		this.socket = socket;
	}

	public void run(){
		try {
			BufferedReader entree = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while(true) {
				String texte = entree.readLine();
				if (texte == null) break;
				if (texte == null) System.exit(0);
				System.out.println(texte);
			}
                        entree.close();
		}
		catch(IOException exc) {
                  exc.printStackTrace();
               }
	}
}

class Emetteur extends Thread{
	Socket socket;

	Emetteur(Socket socket) throws IOException {
		this.socket = socket;
	}

	public void run(){
		try {
			BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
			PrintStream sortie = new PrintStream(socket.getOutputStream());
			while(true) {
				String texte = entree.readLine();
				if (texte == null) break;
				sortie.println(texte);
			}
                        sortie.close();
		}
		catch(IOException exc) {
		exc.printStackTrace();
             }
	}
}

class Connecte {
	public static void main(String[] arg) throws IOException {
		int portEcouteServeur = 40302;
		ServerSocket standardiste;
		Socket socket;

		try {
			socket = new Socket(arg[0],portEcouteServeur);
		}
		catch(IOException exc) {
			standardiste = new ServerSocket(portEcouteServeur);
			socket = standardiste.accept();
		}
		(new Recepteur(socket)).start();
		(new Emetteur(socket)).start();
	}
}

Vous pouvez accéder à :


texte == null : cela se produit si la communication a été coupée.
socket = new Socket(arg[0],portEcouteServeur); : cette demande de connexion échoue si l'utilisateur de la machine indiquée par arg[0] n'a pas encore lancé le programme ; le flux d'exécution se retrouve dans le bloc catch qui crée une instance de ServerSocket pour attendre les demandes de connexion ; l'autre utilisateur devrait faire ensuite sa demande de connexion, cette seconde demande de connexion aboutira alors.

© Irène Charon, TéléParisTech 2011