Implémentation de la communication entre les
agents de HEDAYA
Pour implémenter la communication entre agents,
plusieurs moyens existent : au niveau le plus bas, il existe les sockets
qui permettent aux différents agents codés en Java de
communiquer entre eux ; il existe aussi d'autres technologies (en Java
notamment). On peut citer l'invocation de méthodes distantes (RMI Remote
Method Invocation) et la technologie CORBA (Common Request Broker
Architecture).
Une socket est une abstraction de programmation
représentant les extrémités d'une connexion entre deux
ordinateurs. Pour chaque connexion donnée, il existe une socket
sur chaque machine, on peut imaginer un câble virtuel reliant les
deux ordinateurs, chaque extrémité étant enfichée
dans une socket. En Java, on crée un objet Socket pour
établir une connexion vers une autre machine, puis on crée un
InputStream et un OutputStream à partir de ce Socket,
afin de traiter la connexion en tant qu'objet flux d'entrée/sortie.
Le principe de l'invocation de méthodes distantes et de
permettre à un objet présent sur une autre machine de lui envoyer
un message et l'on obtient le résultat comme si cet objet était
instancié sur la machine locale. L'invocation de méthodes
distantes exige de créer une interface distante (remote interface) sur
la machine serveur ; ainsi, l'implémentation sous-jacente est
masquée aux différents clients.
La norme CORBA fait partie du travail réalisé
par l'OMG (Object Management Group) pour définir des standards
d'interopérabilité des objets distribués et
indépendants du langage. Elle fournit la possibilité de faire des
appels à des méthodes distantes dans des objets Java et non Java,
d'interfacer des systèmes existants sans se soucier de leur emplacement.
CORBA dispose d'un langage de définition d'interface, IDL (Interface
Definition Language), qui précise les types de données, les
attributs, les opérations, les interfaces, etc.
Nous avons choisi de faire communiquer nos agents par les
sockets Java, qui assure une communication en utilisant le protocole
TCP/IP. Chaque agent lors de son fonctionnement ouvre son socket serveur et
attend les messages des autres agents, si un message arrive il lance un thread
pour le traiter, donc il n'y a pas de message en attente de traitement ;
c'est-à-dire plusieurs messages peuvent être traités en
parallèle (Figure 3.9).
Création de socket serveur
While (true){
Création de thread de traitement de requête
Lancement de thread(traite la requête et établit
la réponse)
}
Un agent lorsqu'il a besoin de communiquer avec les autres
agents il ouvre une communication avec un socket client, qui communique avec
socket serveur de l'agent récepteur, en spécifiant l'adresse de
la machine et le port puis il envoie le message (Figure 3.10).
Les messages KQML sont implémentés en
définissant la classe Java KQMLmessage illustré dans la Figure
3.11.
La communication consiste à l'instanciation d'un objet
de la classe KQMLmessage, la définition des ses attributs, puis l'envoi
de cet objet. La classe KQMLmessage implémente l'interface Serializable,
ce qui permet l'envoi et la réception des objets de cette classe par les
sockets comme stream (flot).
Création de socket client (Nom Haute ou adresse IP, port)
Envoie de massage
...Attente de réponse ...
Réception de réponse
public class KQMLmessage
implements Serializable {
private String performative;
private String sender;
private String receiver;
private String in_reply_to;
private String reply_with;
private String language;
private String ontology;
private Content content;
....
....
}
Figure 3.11:Classede message KQML
|