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

3

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

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

因此,客户端A接收到了为客户端B保留的密钥,由于特定的算法,这种情况不应该发生。

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

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

1个回答

4

我在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
{
  // ...
}

听起来很复杂。我在哪里可以找到你的书?谢谢。 - Paulo Pedroso
这并不复杂,它只是第二个远程对象而已。书名为Pitt&McNiff的《java.rmi:远程方法调用指南》,Addison Wesley 2001年版,但在谷歌上搜索“远程会话模式”也可以找到有用的信息。 - user207421
出于好奇,我在我的最新项目中遇到了一个问题,当客户端改变IP地址时(当离开会议时使用无线网络而不是电缆),我无法重新连接。在这种情况下,我从未能够重新连接。这个问题简单吗?还是我应该在论坛上发布呢? - Paulo Pedroso
这是一个新问题,我不知道“this one”是什么意思。 - user207421
1
@EJB 谢谢!它完美地运行了。我甚至不需要在代码中做太多的更改。非常感谢您,亲切的先生。 (; - user2263192

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接