2017-01-01 2 views
2

문제로 고민 중입니다. 나는 서버 프로그램 인 클라이언트 &을 가지고 있으며 그들 사이에서 통신하기 위해 RMI를 사용한다.RMI에서 매개 변수로 전달할 때 "this"참조가 변경됨

에있어서, "접속"은 클라이언트 측 호출되고, 클라이언트가 connect(this) 방법은 파라미터 stub.connect(this)

으로 자신의 참조를 전달 서버는 목록과는 HashMap에 this (클라이언트 참조)를 둔다. 나는 그들 모두가 채워져 있는지 확인했다.

지도 나 목록에서 나중에 참조를 찾으려고 할 때 this이 변경된 것 같습니다. 예를 들어, move(this,direction)을 클라이언트로부터 호출하면 서버는 두 맵 & hashmap에서 연관된 클라이언트를 찾지 못합니다.

public class Client extends JFrame implements KeyListener, IClient{ 

     private IServer stub; 
     private Grid gameGrid; 

     public Client() throws AccessException, RemoteException, NotBoundException{ 
      gameGrid = new Grid(); 
      setTitle("Sweet collector game"); 
      setSize(840, 560); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      add(gameGrid); 
      setVisible(true); 
      addKeyListener(this); 

      Registry registry = LocateRegistry.getRegistry(10000); 
      stub = (IServer) registry.lookup("IServer"); 
      stub.connect(this); 
     } 

서버 측 연결 방법 : 여기

stub.connect(this) 전화 코드

public void connect(IClient c) throws RemoteException { 
    System.out.println("New player joined the game !"); 
    this.currentPlayers.add(c); 
    Random rand = new Random(); 
    Position2D<Integer,Integer> init = new Position2D<Integer,Integer>(rand.nextInt(gridsize-1),rand.nextInt(gridsize-1)); 
    while(this.sweetsPosition.contains(init) || this.playersPosition.containsValue(init)){ 
     init = new Position2D<Integer,Integer>(rand.nextInt(gridsize-1),rand.nextInt(gridsize-1)); 
    } 
    this.playersPosition.put(c,init); 
} 

하지만 동일한 클라이언트에서 move(this,direction)를 호출 할 때이 목록 /지도의 오른쪽 개체를 찾을 수 없습니다 :

public void move(int direction, IClient c) throws RemoteException { 
     if(this.playersPosition.containsKey(c)){ //always return FALSE for a reason I ignore 

(분명히 동일) 클라이언트로부터의 전화 :

public void keyPressed(KeyEvent k) { 
    int keyCode = k.getKeyCode(); 
    try { 
     stub.move(keyCode, this); 

나는 내 문제가 충분히 노출되기를 바랍니다. 나는 정말로 당신의 도움이 필요합니다. 나는 이것을 혼자서 고칠 수는 없다고 생각합니다. 아마 RMI와 관련이 없을 수도 있습니다.

고마워요.

+0

ID 시스템을 고려해야 할 수도 있습니다. ID가 변경되면 클라이언트 찾기가 더 쉬워집니다. –

+0

더 나은 솔루션을 원합니다. RMI를 통해 객체를 전달할 수 있어야합니다 ... – LostReality

답변

1

RMI를 통해 IClient을 전달할 때마다 수신자는 다른 개체를 받게됩니다. IClientequals()hashCode()을 올바르게 구현하지 않으면 해시 맵 키로 작동하지 않습니다.

또한 이 아니며은 직렬화를 통해 JFrames를 통과해야합니다. Javadoc에서 주요 경고를 확인하십시오. 어떤 경우에는 의미가 없습니다. 리펙터.

+0

답변을 주셔서 감사합니다. 그런 다음 내 클라이언트를 내 서버에 식별하기 위해 "equals"및 "hashcode"를 구현해야합니까? 그리고 JFrame을 속성으로 지정하십시오. 감사합니다. – LostReality

+1

'transient' 속성입니다. – EJP