import java.io.*;
import java.net.*;
import net.jxta.document.*;
import net.jxta.endpoint.*;
import net.jxta.exception.*;
import net.jxta.peer.*;
import net.jxta.peergroup.*;
import net.jxta.pipe.*;
import net.jxta.util.*;
import net.jxta.protocol.*;
import net.jxta.id.*;
import java.util.HashSet;
/**
* Classe permettant l'envoi de message sur un pipe (pipe d'emission)
* La classe cree un pipe suivant un modele d'annonce (advertisement)
* La classe fournit des fonctions d'envoi des messages
*/
public class Client extends Thread {
private PeerGroup peerGroup = null; //groupe d'appartenance du pair
private OutputPipe outputPipe = null; //pipe d'emission de message
private String monFichier = ""; //nom du fichier contenant l'annonce
/**
* Constructeur de la classe Client
*/
public Client(String s,PeerGroup p) {
peerGroup = p;
monFichier = s;
}
/**
* Chargement de l'annonce et creation du pipe d'emission principal
*/
public void loadPipeAdv(String fileName) throws FileNotFoundException, IOException {
//chargement de l'annonce depuis un fichier
FileInputStream file = new FileInputStream(fileName);
MimeMediaType asMimeType = new MimeMediaType("text/xml");
//il s'agit d'un pipe de diffusion (multicast)
PipeAdvertisement pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(asMimeType, file);
//creation du pipe de communication
PipeService pipeService = peerGroup.getPipeService();
outputPipe = pipeService.createOutputPipe(pipeAdv,60000);
}
/**
* Lancement de la classe Client
*/
public void run() {
try {
loadPipeAdv(monFichier);
} catch (Exception e) { System.err.println("Erreur dans Client.run() : "); e.printStackTrace(); }
}
/**
* Envoi de messages sur le pipe principal (multicast)
* Le message est de "Type" MESSAGE et contient les champs
* ["Auteur" (nom de l'emetteur) --> c'est a vous de le faire] et "Texte" (texte du message)
*/
public void sendMessage(String messageString) {
//creation du nouveau message et des differents champs
Message message = new Message();
MessageUtilities.addString(message,"Type","MESSAGE");
MessageUtilities.addString(message,"Texte", messageString);
MessageUtilities.addString(message,"Auteur", peerGroup.getPeerName().toString());
//si le pipe n'est pas null, j'envoie le message
if (outputPipe != null) {
try {
outputPipe.send(message); //envoi du message sur le pipe
} catch (IOException e) { }
}
else {
System.err.println("Erreur dans Client.sendMessage() : OutputPipe == null");
}
}
/**
* Pour demander la liste des documents a tous les pairs
* Le message est de "Type" DEMANDE_LISTE_DOCUMENTS
* L'unique champ supplementaire est "Auteur" et contient le PeerID de l'expediteur
*/
public void demandeListeDocuments(PeerID pid) {
Message message = new Message();
MessageUtilities.addString(message,"Type","DEMANDE_LISTE_DOCUMENTS");
MessageUtilities.addString(message,"Auteur", peerGroup.getPeerID().toString());
//creation du nouveau message et des differents champs
//on utilise la fonction toString() afin de convertir n'importe quoi en chaine
if (outputPipe != null) {
try {
outputPipe.send(message); //envoi du message sur le pipe
} catch (IOException e) { }
}
else {
System.err.println("Erreur dans Client.sendMessage() : OutputPipe == null");
}
//si le pipe n'est pas null, j'envoie le message
}
/**
* Creation d'un pipe d'emission dirige vers un unique pair
*/
public OutputPipe creationPipe(PeerID pid) {
//pipe d'emission
OutputPipe myPipe = null;
try {
FileInputStream file = new FileInputStream("PropagatePipeAdv.xml");
MimeMediaType asMimeType = new MimeMediaType("text/xml");
PipeAdvertisement pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(asMimeType, file);
PipeService pipeService = peerGroup.getPipeService();
//creation de l'ensemble (a un seul element dans notre cas) des pairs pouvant recevoir les messages
HashSet resolve = new HashSet();
resolve.add(pid);
//creation du pipe de communication
myPipe = pipeService.createOutputPipe(pipeAdv, resolve, 60000);
} catch (Exception e) {System.err.println("Erreur dans Client.creationPipe()");}
return myPipe;
}
/**
* Envoi de la liste des documents locaux suite a une demande
* L'envoi se fait sur un pipe temporaire dirige vers un seul pair destinataire
* Le message est de "Type" ENVOI_LISTE
* Les champs sont "Auteur" (PeerID) et "Liste" (liste des documents locaux)
*/
public void envoiListeDocuments(PeerID pid,String listeDoc) {
//creation d'un pipe d'emission temporaire
OutputPipe tempPipe = creationPipe(pid);
//creation du message et des differents champs
Message message = new Message();
MessageUtilities.addString(message,"Type","ENVOI_LISTE");
MessageUtilities.addString(message,"Auteur", peerGroup.getPeerID().toString());
MessageUtilities.addString(message,"Liste", listeDoc);
//si le pipe n'est pas null, j'envoie le message
if (outputPipe != null) {
try {
tempPipe.send(message); //envoi du message sur le pipe
} catch (IOException e) { e.printStackTrace(); }
}
else {
System.err.println("Erreur dans Client.sendMessage() : OutputPipe == null");
}
//fermeture du pipe temporaire avec la methode close()
tempPipe.close();
}
/**
* Message de demande d'un document a un pair defini
* Le message est de "Type" DEMANDE_DOC
* Les autres champs sont "Auteur" (PeerID) et "NomDocument" (nom du document demande)
*/
public void demanderDocument(PeerID pid,String nom_doc) {
//creation d'un pipe d'emission temporaire
OutputPipe tempPipe = creationPipe(pid);
//creation du message et des differents champs
Message message = new Message();
MessageUtilities.addString(message,"Type","DEMANDE_DOC");
MessageUtilities.addString(message,"Auteur", peerGroup.getPeerID().toString());
MessageUtilities.addString(message,"NomDocument", nom_doc);
//si le pipe n'est pas null, j'envoie le message
if (outputPipe != null) {
try {
tempPipe.send(message); //envoi du message sur le pipe
} catch (IOException e) { e.printStackTrace(); }
}
else {
System.err.println("Erreur dans Client.sendMessage() : OutputPipe == null");
}
//fermeture du pipe temporaire avec la methode close()
tempPipe.close();
}
/**
* Envoi du fichier sous forme d'une chaine de caracteres dans un message
* Le "Type" du message est ENVOI_DOC
* Les autres champs sont "Auteur" (PeerID) "NomDocument" (nom du fichier) "Contenu" (contenu du fichier)
*/
public void envoyerFichier(String nom_doc,String le_fichier,PeerID pid) {
//creation d'un pipe d'emission temporaire
OutputPipe tempPipe = creationPipe(pid);
//creation du message et des differents champs
Message message = new Message();
MessageUtilities.addString(message,"Type","ENVOI_DOC");
MessageUtilities.addString(message,"Auteur", peerGroup.getPeerID().toString());
MessageUtilities.addString(message,"NomDocument", nom_doc);
MessageUtilities.addString(message,"Contenu", le_fichier);
//si le pipe n'est pas null, j'envoie le message
if (outputPipe != null) {
try {
tempPipe.send(message); //envoi du message sur le pipe
} catch (IOException e) { e.printStackTrace(); }
}
else {
System.err.println("Erreur dans Client.sendMessage() : OutputPipe == null");
}
//fermeture du pipe temporaire avec la methode close()
tempPipe.close();
}
}