如何在 java rmi 编码中管理多个本地方法

How to manage multiple local methods in java rmi coding

当我进行 RMI 编码时,我遵循以下步骤

  1. 首先创建一个远程接口。
  2. 然后在远程实现接口class。
  3. 然后实现一个服务器class程序。
  4. 然后实现客户端class程序。
  5. 然后编译运行

现在我正在尝试做:

  1. 首先创建一个远程接口。
  2. 然后在多个远程实现接口class。
  3. 然后实现一个服务器class程序。
  4. 然后实现客户端class程序。

我已经完成了前两个步骤,但不知道如何执行第 3 步和第 4 步,因为我不知道如何管理多个远程 classes。

我的代码如下:

  1. 界面

Calculator.java

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculator extends Remote
{    
    public int sum(int x,int y) throws RemoteException;
}
  1. 本地 classes

Addition.java

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;



public class Addition extends UnicastRemoteObject implements Calculator 
{

    public Addition() throws RemoteException
    {
        super();

    }


    public int sum(int x,int y) throws RemoteException
    {
        return x+y;
    }


}

Subtraction.java

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class Subtraction extends UnicastRemoteObject implements Calculator
{




    public Subtraction() throws RemoteException
    {
        super();


    }

    public int sum(int x,int y) throws RemoteException
    {
        return x-y;
    }
}

现在我正在尝试为多个本地 class 实施服务器 class。但我不知道,如何使用服务器与那些多个本地 class 进行通信,这就是我被卡住的原因。

所以,我几乎不需要帮助。

  1. 在您的界面代码中:您拼错了界面本身的名称。
  2. 注意远程方法 sum 的名称,我在回答中将其更改为 'calculate',以使其更相关。 (你已经使用方法'sum'同时做了加减法)
  3. 您已经创建了接口的多个实现。目前还不清楚,你 'want to do' 接下来和他们一起做什么。
  4. 假设您想要创建一个服务器-客户端模型,其中您有一个接口的多个实现并且您想要调用其中任何一个,您可以为每个实现设置一个服务器:

Interface (Filename: Calculator.java)

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculator extends Remote{
    //remote method declaration    
    public int calculate(int x,int y) throws RemoteException;
}

Implementation 1 of interface: Calculator (Filename: Addition.java)

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Addition extends UnicastRemoteObject implements Calculator{

    public Addition() throws RemoteException{
        super();
    }

    public int calculate(int x,int y) throws RemoteException{
        //define what your remote method will do
        return x+y;
    }
}

Implementation 2 of interface: Calculator (Filename: Subtraction.java)

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Subtraction extends UnicastRemoteObject implements Calculator{

    public Subtraction() throws RemoteException{
        super();
    }

    public int calculate(int x,int y) throws RemoteException{
        return x-y;
    }
}

Server code for Addition class (Filename: ADDserver.java)

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.net.*;
import java.io.*;

public class ADDserver {
    public static void main(String args[]) {
        try{
            //take input the port number
            InputStreamReader is = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(is);
            String portname, registryURL; 
            System.out.println("Enter port:");
            String portNum = (br.readLine()).trim();
            //create remote object
            Addition exportedObj = new Addition();
            //generate registry url for rmi registry server
            registryURL = "rmi://localhost:" + portNum + "/Add";
            //assosiate your object with the url in rmiregistry 
            Naming.rebind(registryURL, exportedObj);
            System.out.println("ADDserver ready");
        } catch (Exception re){
            System.out.println("Exception in ADDserver: " + re);
        }
    }
}

Server code for Subtraction class (Filename: SUBserver.java)

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.net.*;
import java.io.*;

public class SUBserver {
    public static void main(String args[]) {
        try{
            InputStreamReader is = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(is);
            String portname, registryURL; 
            System.out.println("Enter port:");
            String portNum = (br.readLine()).trim();
            Subtraction exportedObj = new Subtraction();
            registryURL = "rmi://localhost:" + portNum + "/Subtract";
            Naming.rebind(registryURL, exportedObj);
            System.out.println("SUBserver ready");
        } catch (Exception re){
            System.out.println("Exception in SUBserver: " + re);
        }
    }
}