RMI en Java

RMI en Java - Java - Programmation

Marsh Posté le 27-03-2006 à 13:44:27    

Bonjour
 
J'ai charger un exemple de RMI en java.
 
Il est composé de 4 fichier java: CountRmiImpl.java   CountRmiServer.java
CountRmiClient.java   CountRmi.java  
 
javac *.java fonctionne bien. Tout est pré-compilé. Je lance java CountRmiServer : il n'y a pas de message d'erreur
Je lance java CountRmiClient, le message: Exception in thread "main" java.rmi.NotBoundException: CountRmi1
   <<No stacktrace available>>
 
apparait.
 
Je précises être sous linux et avoir aussi lancer: rmiregistry &
Avec le message: WARNING: could not properly read security provider files:
         file:///usr/lib/security/libgcj.security
         file:///usr/lib/security/classpath.security
         Falling back to standard GNU security provider
 
 

Reply

Marsh Posté le 27-03-2006 à 13:44:27   

Reply

Marsh Posté le 30-03-2006 à 06:41:51    

Le message n'est pas très clair mais il est possible que le "bind" ait foiré, et donc qu'il n'y ait pas de port associé au serveur...
Note qu'il est possible de faire le "bind" directement dans ton programme, c'est plus propre qu'en appelant "rmiregistry" à côté :

Code :
  1. java.rmi.Naming.bind(...)
 

Reply

Marsh Posté le 12-04-2006 à 09:35:24    

Sur google il y'a qu'une page qui parle de cette erreur et y'a pas d'explication.

Reply

Marsh Posté le 17-04-2006 à 21:45:44    

La classe ici presente permet d'afficher un echiquier ainsi que de gerer les clique de souris et le deplacements des pieces.
Ma question est: doit-elle être au niveau du serveur, au niveau du client ou alors couper avec une partie en serveur et l'autre sur le client?
 
L'objectif étant de pouvoir avoir le même echiquier sur 2 clients differents.
 
J'ai bien essayer de transferer d'un client a l autre le tableau tabEchiquier qui permet la gestion des positions des pièces sur l'echiquier
mais le problème est que la mise à jour ne se fait pas.  
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class Plateau extends JPanel implements MouseListener, MouseMotionListener{
 
 private JeuEchec jeu;
 private Graphics g;
 private ImageIcon imIcon;
 private Image im;
 private Pieces p;
 
 private Pieces [][] tabEchiquier;
 private Dimension dimFenetre;
 private int longPlt;
 private int largPlt;
 private int piece;
 private int valueX, valueY;
 private int lngCase;
 private int lrgCase;
 private String obj;
 private MouseEvent evt;
 private int initX, initY;
 private int passTour;
 
 //Constructeur de la classe Plateau
 public Plateau(JeuEchec j){
  super();
  setVisible(true);
  repaint();
  this.jeu = j;
  tabEchiquier = new Pieces[8][8];
  //this.InitPlateau();
  this.addMouseListener(this);
  passTour = 1;//Forcer le joueur blanc à jouer en premier
 }
 
 //Initialisation du plateau
 public void  InitPlateau(){
  for(int i=0;i<8;i++){
   for(int j=0;j<8;j++){
    tabEchiquier[i][j]=null;
   }
  }
  passTour=1;
  //Pieces(coordX,coordY,couleur, plateau)
  tabEchiquier[0][0]=new Tour(0,0,1,this);
  tabEchiquier[1][0]=new Cavalier(1,0,1,this);
  tabEchiquier[2][0]=new Fou(2,0,1,this);
  tabEchiquier[3][0]=new Reine(3,0,1,this);
  tabEchiquier[4][0]=new Roi(4,0,1,this);
  tabEchiquier[5][0]=new Fou(5,0,1,this);
  tabEchiquier[6][0]=new Cavalier(6,0,1,this);
  tabEchiquier[7][0]=new Tour(7,0,1,this);
  tabEchiquier[0][1]=new Pion(0,1,1,this);
  tabEchiquier[1][1]=new Pion(1,1,1,this);
  tabEchiquier[2][1]=new Pion(2,1,1,this);
  tabEchiquier[3][1]=new Pion(3,1,1,this);
  tabEchiquier[4][1]=new Pion(4,1,1,this);
  tabEchiquier[5][1]=new Pion(5,1,1,this);
  tabEchiquier[6][1]=new Pion(6,1,1,this);
  tabEchiquier[7][1]=new Pion(7,1,1,this);
  tabEchiquier[0][6]=new Pion(0,6,2,this);
  tabEchiquier[1][6]=new Pion(1,6,2,this);
  tabEchiquier[2][6]=new Pion(2,6,2,this);
  tabEchiquier[3][6]=new Pion(3,6,2,this);
  tabEchiquier[4][6]=new Pion(4,6,2,this);
  tabEchiquier[5][6]=new Pion(5,6,2,this);
  tabEchiquier[6][6]=new Pion(6,6,2,this);
  tabEchiquier[7][6]=new Pion(7,6,2,this);
  tabEchiquier[0][7]=new Tour(0,7,2,this);
  tabEchiquier[1][7]=new Cavalier(1,7,2,this);
  tabEchiquier[2][7]=new Fou(2,7,2,this);
  tabEchiquier[3][7]=new Roi(3,7,2,this);
  tabEchiquier[4][7]=new Reine(4,7,2,this);
  tabEchiquier[5][7]=new Fou(5,7,2,this);
  tabEchiquier[6][7]=new Cavalier(6,7,2,this);
  tabEchiquier[7][7]=new Tour(7,7,2,this);
 }
 
 public Pieces[][] getTabEchiquier(){
  return tabEchiquier;
 }
 
 public void setTabEchiquier(Pieces tabEchiq[][]){
  for(int i=0;i<8;i++){
   for(int j=0;j<8;j++){  
    tabEchiquier[i][j] = tabEchiq[i][j];
   }
  }
 }
 
 public int getPassTour(){
 System.out.println("verif getPasstour: "+passTour);
  return passTour;
 }
 
 public void mouseExited(MouseEvent e){
 }
 
 public void mouseClicked(MouseEvent e){
 }
 
 public void mouseEntered(MouseEvent e){
 }
 
 public void mouseMoved(MouseEvent e){
 }
 
 public void mouseDragged(MouseEvent e){
 }
 
 public void mousePressed(MouseEvent e){
  int x;
  int y;
  x = e.getX()/lrgCase;
  y = e.getY()/lngCase;
 
  System.out.println("Bonjour" + " "+ x + " " + y + " " + piece);
  this.valueX = x;
  this.valueY = y;
  if(x<8 && y<8){
     p = tabEchiquier[x][y];
   tabEchiquier[x][y]=null;
   initX = x;
   initY = y;
  }else{
   p=null;
  }
 }
 
 //Action de la souris
 public void mouseReleased(MouseEvent e){
  int x;
  int y;
  x = e.getX()/lrgCase;
  y = e.getY()/lngCase;
  System.out.println("Terminer" + " "+ x + " " + y + " " + piece);
  if(x<8 && x>=0 && y<8 && y>=0){
   p.setFin(x,y);
   if(p.deplacer()==true){
    tabEchiquier[x][y] = p;
    p.setInit(x,y);
    if(passTour==1){
     passTour=2;
    }else{
     passTour=1;
    }
    System.out.println("Valeur du tour "+passTour);
   }else{
    tabEchiquier[valueX][valueY]=p;
   }
   repaint();
  }else{
   System.out.println("Vous etes con ou quoi de mettre la piece en dehors de l echiquier" );
   tabEchiquier[initX][initY]=p;
  }
 }
 
 //Affichage du plateau
 public void paint(Graphics g){
  int longCase;  
  int largCase;
  int longEch;
  int largEch;
 
  super.paint(g);
  dimFenetre = getSize();
  largEch = dimFenetre.height;
  longEch = dimFenetre.width;
  largEch = largEch-largEch/15;
  longEch = longEch-longEch/15;
  largPlt = largEch;
  longPlt = longEch;
  largCase = largEch/8;
  longCase = longEch/8;
  lrgCase = largCase;
  lngCase = longCase;
  CaseEchec [][] c = new CaseEchec[8][8];
   
  for(int i=0; i<8; i++){
   for(int j=0; j<8; j++){
    if(i%2 == 0){
     if(j%2 == 0){
      c[i][j] = new CaseEchec(i*largCase, j*longCase,largCase,longCase, 0, this);
      c[i][j].paint(g);
     }else{
      c[i][j] = new CaseEchec(i*largCase, j*longCase, largCase, longCase,1, this);
      c[i][j].paint(g);
     }
    }else{
     if(j%2 == 0){
      c[i][j] = new CaseEchec(i*largCase, j*longCase, largCase, longCase, 1, this);
      c[i][j].paint(g);
     }else{
      c[i][j] = new CaseEchec(i*largCase, j*longCase, largCase, longCase, 0, this);
      c[i][j].paint(g);
     }
    }repaint();
   }  
 }
  for(int i=0;i<8;i++){
   for(int j=0;j<8;j++){
    if(tabEchiquier[i][j]!=null){
     im = tabEchiquier[i][j].iPiece;
     g.drawImage(im,i*largCase,j*longCase,largCase,longCase,this);
    }
    repaint();
   }
   }
  }
 }

Message cité 1 fois
Message édité par marc90 le 17-04-2006 à 21:57:18
Reply

Marsh Posté le 17-04-2006 à 21:59:52    

Precision: la classe Plateau est pour l'instant appellée par une classe Jeu qui est un JFrame et qui contient des boutons menus qui eux aussi devront se trouver sur les 2 clients.

Reply

Marsh Posté le 18-04-2006 à 08:36:03    

marc90 a écrit :


Ma question est: doit-elle être au niveau du serveur, au niveau du client ou alors couper avec une partie en serveur et l'autre sur le client?


 
Le serveur "collecte" les informations du jeu. C'est lui qui s'occupe du core du jeu. C'est à lui de gérer l'ensemble des déplacement de pions, d'enlever les pions adéquats...
 
Le client ne fait qu'afficher l'état du plateau et interragit avec celui-ci.
 
En fait, lorsque le client détecte un clic de souris sur une des cases, il faut qu'il envoie un message au serveur pour dire : "j'ai bougé tel pion, qui est parti de telle case pour aller jusqu'à telle case". De là, le serveur, une fois le message reçu, change l'état des cases (uniquement celles où ça doit-être le cas) en conséquence.
 
Une fois que le serveur a mis à jour les cases, il envoie un message au client pour les prévenir que des cases ont été mis à jour : "La case en x/y a changé d'état, ainsi que celle en x2/y2, remets-les à jour graphiquement."
 
Finalement, on peut dire, que le client ne fait qu'afficher le plateau et envoie les messages de mise à jour.
Le serveur gére le core du jeu et envoie les messages à l'ensemble des client pour qu'il mette à jour leur plateau graphique.

Reply

Marsh Posté le 18-04-2006 à 08:43:04    

Daccord merci pour cette réponse tant attendue.
Donc la fonction paint() ainsi que le JFRame avec les boutons du menu doit_être au niveau du client.
Et donc le serveur lui stock le tableau representant les position de piece ainsi que la facon dont peuvent bouger les pieces. Donc la classe ci dessus va devoir etre decoupée :-(
 
Les fichiers gifs représentant les pieces doivent-ils être sur le client ou doivent-ils être récupérer depuis le serveur?


Message édité par marc90 le 18-04-2006 à 10:33:12
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed