2

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

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

所以客户端 A 接收到为客户端 b 保留的密钥,由于特定的算法,这种情况不可能发生。

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

如何为每个客户制作一个 OneTimePad 类的对象?

4

1 回答 1

3

我在 2001 年的书中将其称为远程会话模式。Registry 中的远程对象是一种只导出一个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
{
  // ...
}
于 2013-04-09T21:55:23.710 回答