如何在RMI回调中正确识别和保存客户端引用?

时间:2016-03-03 19:51:29

标签: java rmi

我有一台服务器和几个客户" (服务器实际上是因为回调)。客户端只能通过服务器向另一个发送消息。为此,服务器必须:

  1. 识别呼叫客户端。
  2. 抓住客户'信息和导出的对象引用,以便它能够查找收件人。
  3. 我已阅读远程会话模式(123)和here以及here,但我无法理解找到我想要的答案。

    对于(1),我看到以下选项:

    1. 客户端在调用服务器期间发送其导出的对象引用。
    2. 客户端在呼叫服务器期间发送一些标识信息。
    3. 客户端标识为getClientHost
    4. 收件人必须作为一些身份信息发送,因为客户不会互相引用。

      public interface RemoteClient extends Remote {
      
          void message(String sender, String message);
      }
      
      public interface RemoteServer extends Remote {
      
          void relayMessage(String recipient,       RemoteClient sender,     String msg);
                            // or some identifier?  // or string/identifier?
      }
      
      public class RemoteServerImpl extends UnicastRemoteObject implements RemoteServer {
      
          void relayMessage(String recipient, RemoteClient sender, String msg) {
      
              RemoteClient recp = lookup(recipient); // See point 2 below
              String sndr = getRepresentation(sender); // See below...
              recp.message(sndr, msg);
      
             // OR using
      
             String sndr = getRepresentation(getClientHost());
             // Then sender parameter is not needed
          }
      }
      

      我非常确定getClientHost不是识别来电者的可靠方式,因为它可以与其他IP断开连接并重新连接,而且我不确定是否有2台计算机相同的局域网,这种方法将能够区分它们。

      对于(2),我看到的选项是:

      1. 保留Map个身份信息和客户'导出的对象(如上所述,但不推荐,在上述答案之一中)。
      2. 保留Set个客户信息对象,这些对象包含远程对象引用和任何相关信息。
      3. 这些在登录(注册)和注销时更新。

        然后lookup获取信息并返回远程对象引用,getRepresentation类似于反向查找。

        我的问题不是让它工作(它正在工作),而是让它正常工作。是否有任何优势或优先方式来自上述或其他方式?

1 个答案:

答案 0 :(得分:0)

您似乎根本不了解远程会话模式。客户端调用远程方法的会话对象对于客户端是唯一的,因此在后续调用会话期间没有必要进一步标识自身。无论客户端发送到登录对象以获取会话的任何信息都可以存储在会话对象中,或者服务器可以自己分配唯一的客户端ID。会话对象当然也应该包含回调:它是唯一合理的地方。