【问题标题】:RMI multiple clients - one server object for each of themRMI 多个客户端 - 每个客户端都有一个服务器对象
【发布时间】:2013-04-09 21:07:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java rmi


    【解决方案1】:

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

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

    【讨论】:

    • 听起来很复杂。我在哪里可以找到你的书?谢谢。
    • 它并不复杂,它实际上只是第二个远程对象。这本书是 Pitt & McNiff,java.rmi: The Guide to Remote Method Invocation, Addison Wesley 2001,但是 google 的“远程会话模式”应该也能找到一些有用的东西。
    • 出于好奇,我在最新的项目中遇到了重新连接客户端的问题,因为客户端更改了 IP 地址(在开会时使用 wifi 而不是电缆)。在这种情况下,我永远无法重新连接。这很简单还是我应该在这个问题上打开一个线程?
    • 这是一个新问题,我不知道“这个”是什么意思。
    • @EJB 谢谢!它完美无缺。我什至不必对代码进行很多更改。非常感谢,好心的先生。 (;
    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多