Enregistrement d'objet distant

Fermé
redanovich Messages postés 5 Date d'inscription dimanche 22 juin 2008 Statut Membre Dernière intervention 17 mars 2010 - 16 mars 2010 à 18:02
redanovich Messages postés 5 Date d'inscription dimanche 22 juin 2008 Statut Membre Dernière intervention 17 mars 2010 - 17 mars 2010 à 17:58
Bonjour,
ça fait 10 jours que je suis bloqué sur un problème d'RMI et j'ai rien trouvé sur le net:
je dois développer un factory qui crée des agents avec des coordonnées qui bougent arbitrairement.
la compilation est clean, mais l'exécution se bloque au moment d'enregistrement de l'agent dans le registre. même quand je désactive mon pare-feu

***************************************************************
la classe de l'agent distant:
***************************************************************

package fr.cnamp.agent;
import java.lang.Thread.*;
import java.util.*;
import java.rmi.*;
import java.rmi.Remote.*;
import java.rmi.server.*;

public class AgentOD extends UnicastRemoteObject implements AgentODInt, Runnable
{

int tailleGrille=20; // initialisation de la taille du grille
public Thread th =new Thread(this);
public int x=10;public int y=10; // déclaration des coordonées
int color; // déclaration du couleur de l'agent
int port=9100;

// j'ai mis la fonction moveit en type "char" car avec l'implementation du tread il n'a pas accépté le type "void"
public char moveit() throws RemoteException
{
try{
Random l_rdm =new Random();
int l_sensX = (int)(Math.abs(l_rdm.nextInt())%3) - 1;
int l_sensY = (int)(Math.abs(l_rdm.nextInt())%3) - 1;
x = x + l_sensX;
y = y + l_sensY;
if (x<0) x=tailleGrille-1;
if (y<0) y=tailleGrille-1;
if (x>tailleGrille-1) x=0;
if (y>tailleGrille-1) y=0;
try
{ // pour attendre une seconde
Thread.sleep(1000); // avant de changer les valeur
} // de x et y.
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
catch (Exception e){System.out.println(e.getMessage());}
//j'ai besoin d'un caractere comme retour, alors j'ai pris une lettre au hazard 'O'
// il n'accepte pas la fonctionde type voide, et je ne sais pas pq???
return 'O';
}
public void run()
{
try
{
while(true) {moveit();}
}
catch(Exception e){e.getMessage();}
finally {System.out.println("fin de run : ");
}
}
// pour envoyer les coordonné au factory s'il la demande
public int getX(){return this.x;}
public int getY(){return this.y;}
public AgentOD(int new_x,int new_y,int reqcolor)throws RemoteException
{
x=new_x;y=new_y; // mettre les coordonnées demandé par l'exterieur.
color= reqcolor;
}

}

*******************************************************************
la classe du factory:
***************************************************************

package fr.cnamp.factory;
import java.lang.Thread.*;
import java.rmi.Remote.*;
import java.rmi.server.*;
import fr.cnamp.agent.*;
import fr.cnamp.factory.*;
import java.rmi.registry.*;
import java.rmi.*;

public class FactoryJeuAgentOD extends UnicastRemoteObject implements FactoryJeuAgentODInt
{
// Attributs de FactoryJeuAgentOD
private String name;
private int nb;
private int color;
private int port;
private AgentOD[] listAgent; // tableau des agents

//constructeur FactoryJeuAgentOD
public FactoryJeuAgentOD(String reqname,int reqnb, int reqcolor, int reqport) throws Exception{
name=reqname;
nb=reqnb;
color=reqcolor;
port=reqport;
listAgent=new AgentOD[reqnb+1];

System.out.println("Execution de FactoryJeuAgentOD :");
try
{
// création des agents dans le tableau.
for (int i=1;i<=reqnb;i++)
{
System.out.println("Creation de l'Agent "+ i+"/"+reqnb);
listAgent[i]=new AgentOD(10,10, reqcolor);
System.out.println("Creation de l'Agent "+i+" termine ds factory");

//enregistrement de l'agent dans le registry
Naming.rebind("rmi://localhost:"+port+ "/"+"factory"+i ,this);
}

// pour faire bouger les agents dans le factory et pas dans l'AgentOD
moveAgent();
}
catch(Exception e){System.out.println(e.getMessage());}
}
// la fonction qui appellera le thread de deplacement de chaque agent.
public void moveAgent()throws RemoteException{
System.out.println("demarage de moveAgent() pour "+this.nb+" agents: ");
for (int i=1; i<=this.nb;i++)
{
System.out.println("demarage du tread " + i);
listAgent[i].th.start();
}
}
// afficher les coordonnées en appellant les fonction getX() et getY() dans AgentOD
public void printXY()throws RemoteException{

try{
//boucle d'affichage et de deplacement.
System.out.print("\n");
for (int i=1; i<=this.nb;i++){System.out.print("agent " + i+" \t");}System.out.println();
System.out.println();

while(true){
for (int i=1; i<=nb;i++){
System.out.print(listAgent[i].x + " - " + listAgent[i].y+"\t\t" );
}
try{ // pour attendre une seconde
Thread.sleep(1000); // avant de charger les valeur
} // de x et y,
catch (InterruptedException e){
System.out.println(e.getMessage());
}System.out.println();
}
}catch (Exception e){e.getMessage();}

}
public void creatFactory(String reqname,int rnb, int rcolor, int rport)throws RemoteException{
try{
FactoryJeuAgentOD fact=new FactoryJeuAgentOD( reqname, rnb, rcolor, rport);
fact.printXY();
}catch (Exception e){e.getMessage();}}

public static void main(String argv[]) throws Exception
{
try
{
// Creation de l'adptateur
LocateRegistry.createRegistry(9101);
}
catch(Exception e){
// si il existe deja alors inutile de le creer
}

try{
FactoryJeuAgentOD fact=new FactoryJeuAgentOD( "bux",5,1,9103);
fact.printXY();
}catch (Exception e){e.getMessage();}
}
}

j'ai cherché partout une solution pour ce problème mais j'ai pas trouvé, alors merci pour votre aide!!

1 réponse

redanovich Messages postés 5 Date d'inscription dimanche 22 juin 2008 Statut Membre Dernière intervention 17 mars 2010
17 mars 2010 à 17:58
j'espère que vous ne m'avez pas oublié, car j'y suis toujours bloqué, et je n'arrive pas à continuer
0