Я хочу построить систему так, чтобы: 1. Клиент подключается к серверу 2. Клиент запрашивает порт для сервера 3. Сервер создает удаленный объект для обслуживания Клиента и связывает его с порт 4. возвращение номер порта клиента 5. Клиент подключается к портуRMI реализация Управление сеансом
Мой менеджер сессии/подключение
public class ConnectionManager extends UnicastRemoteObject implements Server
{
public List<ClientHandler> clients = Collections.synchronizedList(new ArrayList<>());
public ConnectionManager() throws RemoteException
{
super();
}
public static final String RMI_ID = "Server";
@Override
public boolean checkConnection() throws RemoteException
{
return true;
}
@Override
public int getPort(String ip) throws RemoteException
{
int i = 10000+clients.size()*2;
clients.add(new ClientHandler(ip, i));
return i;
}
}
реализация Session
public class ClientHandler extends UnicastRemoteObject implements Transfer
{
Registry rmi;
Registry reg;
PrintWriter log;
public Client client;
public ClientHandler(String ip, int port) throws RemoteException
{
super();
try
{
File f = new File(ip+" "+new Date()+".txt");
log = new PrintWriter(f);
}catch (Exception e)
{
e.printStackTrace();
}
rmi = LocateRegistry.createRegistry(port);
try
{
rmi.bind(String.valueOf(port),this);
}catch(Exception e)
{
e.printStackTrace();
}
}
Проблема в том, что если объект создается при удаленном вызове, он рассматривается как удаленный источник, поэтому, если вы не находитесь на том же хосте, ему не разрешено связывать его с LocalRegistry. и server throws java.rmi.AccessException Registry.Registry.bind запрещен: исходный IP-адрес является нелокальным хостом.
Код, который вы опубликовали, не компилируется, и при его исправлении он не ведет себя так, как вы описали. – EJP