문제로 고민 중입니다. 나는 서버 프로그램 인 클라이언트 &을 가지고 있으며 그들 사이에서 통신하기 위해 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와 관련이 없을 수도 있습니다.
고마워요.
ID 시스템을 고려해야 할 수도 있습니다. ID가 변경되면 클라이언트 찾기가 더 쉬워집니다. –
더 나은 솔루션을 원합니다. RMI를 통해 객체를 전달할 수 있어야합니다 ... – LostReality