RMI多个客户端 - 每个客户端一个服务器对象

时间:2013-04-09 21:07:44

标签: java rmi

我正在使用RMI编写加密系统原型。

我遇到了问题,因为当我启动两个客户端时,他们从OneTimePad类中获得了服务器中一个对象的响应。

因此,客户端A重新获得为客户端b保留的密钥,因为特定的算法,这种情况不会发生。

服务器只向客户端发送E和N变量(如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送(因为它将包含所有密钥)。

如何为每个客户端创建OneTimePad类的一个对象?

1 个答案:

答案 0 :(得分:3)

我在2001年的书中称之为远程会话模式。注册表中的远程对象是一种仅导出login()方法的登录服务器。 login()方法如果成功,则每次调用返回一个新的远程对象,它基本上是每个客户端的远程会话对象。此会话对象可以导出logout()方法,该方法不会导出自身,并且它还可以实现Unreferenced,,以便unreferenced()方法也可以取消自身(或者您可以依赖于相同的DGC)无论如何:使用Unreferenced让你有机会记录它。此远程会话对象导出登录客户端应有权访问的所有远程方法,并且因为它是每个客户端,它可以保存客户端状态,因此它是一个会话。

public interface RemoteLogin extends Remote
{
    RemoteSession login() throws RemoteException;
}

public interface RemoteSession extends Remote
{
    void logout() throws RemoteException;
    void myMethod(...) throws RemoteException; // whatever you need
}

public class RemoteLoginImpl extends UnicastRemoteObject implements RemoteLogin
{
  // ...
  public RemoteSession login()
  {
    // ...
    return new RemoteSessionImpl(); // whatever arguments you need
  }
}

public class RemoteSessionImpl extends UnicastRemoteObject implements RemoteSession, Unreferenced
{
  // ...
}