Witam,
Od dłuższego czasu próbuje napisać projekt na zajęcia. Aktualnie potrzebuje pomocy z RMI. Ogólnie serwer już stoi ale chciałbym zrobić tak żebym mógł danego klienta wyrzucić z serwera. Czyli wychodzi na to że musiał bym mieć tablice (prowadzący mówił coś o mapie) i że po prostu bym usuwał jego zdalny obiekt. Wspominał także o tym że przy połączeniu żeby był tworzony unikatowy numer klienta który będzie pamiętany na serwerze.

Musze również dodać że nie do końca kumam to RMI. Czy to jest tak że podczas łączenia się klienta z serwerem na serwerze w rejestrze rmi powinien się dopisać klient (zdalny obiekt). W ogóle gubię się w tym i po raz kolejny proszę o pomoc...

Co chcę osiągnąć:

  • na serwerze bd miał pamiętanych klientów tak żebym mógł ich np. od łączyć.

O co proszę:

  • jak najprościej wytłumaczyć RMI (w miarę czaje o co chodzi ale chciałbym to ujednolicić),
  • w miare możliwości o jakiś przykład
  • o popatrzenie na to co wklejam niżej i wyrażenie swojej szczerej opini ;)

serwer:

public class ServerModel {
	ServerPresenter presenter;
	ServerRMIImp impl;
	Registry registry;
		
	public void setPresenter(ServerPresenter p) {
		presenter = p;	
	}
	
	public boolean runSerwer() throws RemoteException, java.rmi.AlreadyBoundException{
		boolean run = false;
		
		impl = new ServerRMIImp();
		impl.setPresenter(presenter);
		registry = (Registry) LocateRegistry.createRegistry(RMIConst.RMI_PORT);
		registry.bind(RMIConst.RMI_ID, impl);
		run = true;
		return run;
	}	
	
	public void stopSerwer() throws AccessException, RemoteException, NotBoundException{
		registry.unbind(RMIConst.RMI_ID);
	}
}

Implementacja interfejsu:

public class ServerRMIImp extends UnicastRemoteObject implements RMIInterface{
	ServerPresenter presenter;
	
	protected ServerRMIImp() throws RemoteException{
		super();
		
	}
	
	public void setPresenter(ServerPresenter p){
		presenter = p;
	}
	
	@Override
	public void login(String login, String password) {
		presenter.addTextToLog(login);
	}
}

A z klienta łącze się tak:

public class ClientRMI {
	private Registry registry;
	private RMIInterface rmiremote;
	private ClientPresenter presenter;
	private int clientKey;
	
	public ClientRMI(ClientPresenter p) throws AccessException, RemoteException, NotBoundException{
		presenter = p;
		registry = LocateRegistry.getRegistry("localhost", RMIConst.RMI_PORT);
		rmiremote = (RMIInterface) registry.lookup(RMIConst.RMI_ID);
		clientKey = 0;
	}
	
	public void login(String l, String p) throws RemoteException{
		rmiremote.login(l, p);
	}
}

//EDIT
JUŻ WIEM!! - Wywołania zwrotne
W moim przykładzie jest komunikacja tylko i wyłącznie w jedną stronę. Więc muszę stworzyć metodę rejestrująca użytkownika na serwerze do tego interfejs dla użytkownika żeby serwer wiedział jakie metody udostępnia klient. To będzie rozwiązanie?