【问题标题】:How to set up multiple RMI servers on different machines?如何在不同的机器上设置多个 RMI 服务器?
【发布时间】:2015-03-18 17:45:01
【问题描述】:

我有一个 RMI CalculatorServer 和一个 CalculatorClient 类。 出于负载平衡的目的,我想知道如何设置多个服务器,每个服务器在单独的机器上,以便多个客户端可以访问任何服务器。

CalculatorServer.java

public class CalculatorServer implements Serializable{
    public static void main(String[] args) {
        try{
            Registry reg = LocateRegistry.createRegistry(7000);
            CalculatorImpl ci = new CalculatorImpl();
            reg.bind("calc", ci);

            JOptionPane.showMessageDialog(null, "Server Started.");
        }
        catch(RemoteException e){
            System.out.println("Server Remote Exception: "+e);
        }
        catch(AlreadyBoundException e){
            System.out.println("Server Already Bound Exception: "+e);
        }
    }
}

CalculatorClient.java

public class CalculatorClient {
    public static void main(String[] args) {
        Scanner sn = new Scanner(System.in);

        System.out.println("Enter first number :");
        int x = sn.nextInt();
        System.out.println("Enter second number :");
        int y = sn.nextInt();

        try{
            Registry reg = LocateRegistry.getRegistry("127.0.0.1", 7000);
            CalculatorInterface ci = (CalculatorInterface)reg.lookup("calc");

            int sum = ci.add(x, y);

            System.out.println("Sum is: "+sum);
        }
        catch(RemoteException e){
            System.out.println(" Client Remote Exception: "+e);
        }
        catch(NotBoundException e){
            System.out.println(" Client Remote Exception: "+e);
        }
    }
}

【问题讨论】:

  • 定义“创建”。不清楚你在问什么。
  • 我想在每台服务器上拥有 CalculatorServer.java 类(及其实现)的多个副本。那么任何客户端都必须能够访问任何服务器。
  • 你这样做的问题是什么?
  • 问题是客户端只能访问一台服务器。在我的 CalculatorClient.java 中,我有以下行,它使用特定的 IP 地址“连接”到特定的主机:Registry reg = LocateRegistry.getRegistry("127.0.0.1", 7000);。我想要一个服务器池,客户端可以访问任何服务器。
  • 我想您已经发现了 JavaEE 被发明的原因之一......

标签: java jakarta-ee rmi


【解决方案1】:

假设您有多个服务器(例如 5 个)。您可以使用所有 5 个 IP 地址填充数组列表。然后每次客户端发出请求时,从arraylist中随机选择一个服务器IP。

public class generateServerIP {
    public static void main(String args[]){
        ArrayList<String> al = new ArrayList<>();
        al.add("172.62.22.103");
        al.add("172.62.22.123");
        al.add("172.62.22.15");
        al.add("172.62.22.187");
        al.add("172.62.22.110");

        int ip = new Random().nextInt(al.size());
        System.out.println(al.get(ip));
    }  
}

要连接到服务器,请使用以下命令:

Registry reg = LocateRegistry.getRegistry(ip, 7000);

nextInt(int n) 方法使用均匀分布,因此从 arraylist 中选择任何 ip 的概率等于选择任何其他 ip 的概率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多