La découverte de ces vertus a donné l'idée de les transposer à d'autres applications.
Le modà¨le du client-serveur omni-présent dans les systà¨mes distribués est remis en question.
La question : "Quelles propriétés des P2P peuvent convenir à un type d'application" n'est pas mà»re.
Les protocoles définissent des formats de messages XML qui décrivent les entités d'un systà¨me pair-à -pair et les procédures. Ces protocoles décrivent:
L'ensemble des pairs est scindé en partitions virtuelles hiérarchiques appelées peer groups. Limite les communications à l'intérieur d'un groupe. L'idée est de former un groupe pour réaliser une tà¢che.
Les pairs ne sont pas identifiés par des adresses réseau car JXTA créé un réseau logique sur le réseau physiquei (overlay).
Les ressources (i.e. pairs, groupes, services et pipes) sont représentés par des advertisements (ou annonces).
Une annonce est un document XML contenant des informations pertinentes vis-à -vis du type de ressource (en particulier l'ID de la ressource).
Les annonces sont publiées pour que les autres pairs puissent découvrir une ressource.
Les protocoles sont implémentés par des services de base (Core services) de toute implémentation JXTA:
Le principe général: ne pas chercher directement les ressources, mais les annonces qui donnent cette information.
JXTA procà¨de à 3 type de recherche d'annonces:
Le protocole Peer Discovery définit le format d'une recherche:
<xml version="1.0" encoding="utf-8"?>
<jxta:DiscoveryQuery>
<Type> ... </Type>
<Threashold> .... </Threashold>
<PeerAdv> ... </PeerAdv>
<Attr> ... </Attr>
<Value> ... </Value>
</jxta:DiscoveryQuery>
Format d'une réponse à une recherche:
<xml version="1.0" encoding="utf-8"?>
<jxta:DiscoveryResponse>
<Type> ... </Type>
<Count> ... </Count>
<Threashold> .... </Threashold>
<PeerAdv> ... </PeerAdv>
<Attr> ... </Attr>
<Value> ... </Value>
<Response Expiration="delay">
...
</Response>
</jxta:DiscoveryResponse>
Le Discovery Service fournit des mécanismes pour manipuler les objets du Discovery protocol.
Un exemple des tutoriaux maintenus par jxta.org montre un exemple
simple de découverte.
Code source java : [ JxtaAppDemo.java ].
La découverte et la publication utilisent le service de découverte qui interroge l'ensemble des rendez-vous (rà´le de super-pairs).
JXTA utilise des tables de hachage distribuées (DHT) pour accélérer la découverte. Quand un pair publie une annonce, une fonction de hachage indique le rendez-vous qui mémorisera l'annonce.
Pour fiabiliser le service, réplication partielle des informations détenues par les rendez-vous.
Si aucun rendez-vous ne peut répondre, passage en mode "walk" : propagation de la requête à travers les pairs (beaucoup plus lent).
Création d'un pipe à partir d'un advertisement:
PipeService pipe = netPeerGroup.getPipeService();
...
FileInputStream is = new FileInputStream("pipexample.adv");
XMLDocument document = (XMLDocument)
StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, is);
PipeAdvertisment pipeAdv = (PipeAdvertisement)
AdvertisementFactory.newAdvertisement(document);
...
pipe.createOutputPipe(pipeAdv);
Code source java : [ PipeExample.java ],
[ PipeListener.java ]
advertisement : [ pipexample.adv ].
Ecoute sur un pipe:
// création et enregistrement de this comme PipeMsgListener.
// Quand un message arrive pipeMsgEvent est appelée
InputPipe pipeIn = pipe.createInputPipe(pipeAdv, this);
public void pipeMsgEvent(PipeMsgEvent event) {
Message msg = event.getMessage();
Message.ElementIterator en = msg.getMessageElements();
...
}
Code source java : [ PipeExample.java ],
[ PipeListener.java ]
advertisement : [ pipexample.adv ].
Chaque pair :
Un pair découvrant une annonce de pipe (contenant le PipeID) peut créer un input pipe avec le pipeID et être ainsi relié au pair ayant publié l'annonce.
PeerGroup g = PeerGroupFactory.newNetPeerGroup();
PeerAdvertisement a = g.getPeerAdvertisement();
DiscoveryService d = g.getDiscoveryService();
Indiquer que l'objet courant est un listener : il écoute les évà¨nements de type DiscoveryResponse.
d.addDiscoveryListener(this);
Le listener impose l'installation d'un gestionnaire pour la réception des réponse à l'annonce :
public void discoveryEvent(DiscoveryEvent e) {
...
// code qui fait quelquechose avec e
...
}
Lancer une recherche indirecte (via rendezVous)
d.getRemoteAdvertisements();
Prototype :
int getRemoteAdvertisements(String peerid,
int type,
String attribute,
String value,
int threshold)
une annonce est publiée avec
void publish(Advertisement advertisement)
DiscoveryResponseMsg m = e.getResponse();
PeerAdvertisment a = m.getPeerAdvertisement();
name = a.getPeerName();