Java RMI多服务器/单客户端

时间:2017-11-20 17:48:35

标签: java rmi

您好我是Java RMI的新手,我对Java RMI Server有疑问。 现在我有一个有1个服务器和1个客户端的RMI程序。我被告知用一个客户端创建一个多服务器。将有1个主服务器具有负载平衡和多个子服务器(我不确定这是否是正确的术语),其中主服务器将任务分配给子服务器。 我不知道这实际上是如何工作的。是否可以使用Java RMI?如果是的话,

  1. 不同的服务器意味着每台服务器需要拥有不同的IP? (不同的机器)
  2. 1个IP上可能有多个服务器吗?
  3. 如果是后者,它是如何工作的?我是否只在一台机器上同时运行所有服务器? 至于第一个,我想我在测试时需要很多笔记本电脑,因为现在在我的客户端程序中,客户端需要放置服务器IP,因此,客户端需要放置3个服务器IP(假设我有1个主服务器)服务器和2个子服务器)? 下面是我启动服务器的代码(适用于1台服务器1客户端)

    public class pnServer {
    JFrame f = new JFrame("Server UI");
    JPanel p = new JPanel();
    JTextField tf;
    static java.rmi.registry.Registry reg;
    GridLayout layout = new GridLayout(0,1);
    public pnServer() {
        p.setLayout(layout);
        f.getContentPane().add(p);
        f.setSize(200, 200);
        tf = new JTextField("Server is now ready");
        p.add(tf);
        f.pack();
        f.setDefaultCloseOperation(3);
        f.setVisible(true);
    }
    public static void main (String args[]) {
        pnServer gui = new pnServer();
        try {
            //System.setSecurityManager(new RMISecurityManager());
            p obj = new p();
            reg = java.rmi.registry.LocateRegistry.createRegistry(1099);
            /*pnInterface stub = (pnInterface) UnicastRemoteObject.exportObject(obj, 0);
            Registry reg = LocateRegistry.getRegistry();
            reg.bind("PrimeNum", stub);*/
            Naming.rebind("rmi://localhost/ROG", obj);
            System.out.println("Server is up!");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
      }
    }
    

    我不期待你们的任何代码,但我需要清楚地了解如何解决这个问题。 如果我的代码在任何方面都是错误的,我很抱歉,因为我还是Java RMI的新手,确切地说是1个月。

    提前谢谢

    编辑: 所以我尝试创建1个主服务器(端口2000)和3个子服务器(端口2001,2002,2003)这就是我想出来的

    public static void main (String args[]) throws RemoteException {
    pnServer gui = new pnServer();
    pnInterface stub;
    Registry reg;
    int port = 2001;
    String serverName = "";
    p obj = new p();
    
    /* Starting master server */
    UnicastRemoteObject.unexportObject(obj, true);
    stub = (pnInterface) UnicastRemoteObject.exportObject(obj, 2000);
    reg = LocateRegistry.createRegistry(2000);
    try {
        reg.bind("Server2000", stub);
    }catch (AlreadyBoundException ae) {
        reg.rebind("Server2000", stub);
    }
    System.out.println("Master server is up!\n");
    
    /* Establish connection to sub server with port 2001, 2002, 2003 */
    serverConnection = "Connecting to sub server. Please wait...";
    for (int i = 0; i<3 ; i++) {
        try {
            serverName = "Server" + port;
            UnicastRemoteObject.unexportObject(obj, true);
            stub = (pnInterface) UnicastRemoteObject.exportObject(obj, port);
            reg = LocateRegistry.createRegistry(port);
            try {
                reg.bind(serverName, stub);
            }catch (AlreadyBoundException ae) {
                reg.rebind(serverName, stub);
            }
            serverConnection = serverConnection + "\nSuccessfully listening to port: " + port; 
        }catch (RemoteException ex) {
            ex.printStackTrace();
            serverConnection = serverConnection + "\nFail to listen to port: " + port;
        }
        port += 1;
    }
    System.out.println(serverConnection);
    

    }

    在windows命令中使用netstat命令,我可以看到正在侦听端口2000 - 2003并且所有端口都具有相同的PID。我是否实现了我想要做的事情(创建多个服务器)?这是使用Java RMI执行此操作的正确方法吗?

1 个答案:

答案 0 :(得分:0)

  

不同的服务器意味着每台服务器需要具有不同的IP? (不同的机器)

没有

  

1 IP上可能有多个服务器吗?

当然可以。即使在同一个JVM中。只需导出更多远程对象。

然而,我没有看到实际的观点。如果只有一个服务器主机,则根本没有负载平衡。负载保持在同一主机中。

相关问题