我正在尝试使用JAVA RMI制作计算器。该计算器基于“计算”方法,该方法将“命令”对象作为参数。此命令对象有两个双精度变量(要操作的数字),一个char变量(操作“ +,-,*,/”)。以下是实际代码:
Command类的定义:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Command extends UnicastRemoteObject{
public Command() throws RemoteException
{
super();
}
private double Num1;
private double Num2;
private char Operator;
public Command (double Num1,double Num2,char
Operator) throws RemoteException
{
this.Num1=Num1;
this.Num2=Num2;
this.Operator=Operator;
}
public double getNum1(){
return Num1;
}
public double getNum2(){
return Num2;
}
public char getOperator(){
return Operator;
}
}
`
“计算器”界面的定义:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Calculator extends Remote
{
public double Calculate(Command C) throws
RemoteException;
}
计算器界面的实现
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class CalcuImplem extends UnicastRemoteObject
implements Calculator
{
private double result=0;
public CalcuImplem() throws RemoteException
{
super();
}
public double Calculate(Command C) throws
RemoteException
{
switch (C.getOperator())
{
case '+' :
result=C.getNum1()+C.getNum2();
break;
case '*':
result=C.getNum1()*C.getNum2();
break;
case '-':
result=C.getNum1()-C.getNum2();
break;
case '/':
result= C.getNum1()/C.getNum2();
break;
default:
result=0;
}
return result;
}
}
服务器:
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try {Calculator c = new CalcuImplem();
Naming.rebind("rmi://localhost:1099/CalculatorService",c);
}
catch (Exception e) {System.out.println("Trouble: " + e);}
}
public static void main(String[] args) {
new CalculatorServer();
}
}
客户:
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.Scanner;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
public class CalculatorClient {
public static void main(String[] args) {
char operation = 'f';
Scanner sc = new Scanner(System.in);
System.out.println("Please input the first
number");
double n1= sc.nextDouble();
System.out.println("Please input the second
number");
double n2= sc.nextDouble();
System.out.println("Please choose the
operation:");
System.out.println("a. Add");
System.out.println("b. Substract");
System.out.println("c. Multiply");
System.out.println("d. Divide");
char oc = sc.next().charAt(0);
switch (oc)
{
case 'a' :
operation = '+';
break;
case 'b':
operation = '-';
break;
case 'c':
operation = '*';
break;
case 'd':
operation = '/';
break;
default:
System.out.println("What you has
input is meaningless.");
}
try {
Command cm = new Command(n1,n2,operation);
Calculator c =
'(Calculator)Naming.lookup("rmi://localhost/CalculatorService");
double r = c.Calculate(cm);
System.out.println( r );
} catch (MalformedURLException murle) {
System.out.println(murle);
}
catch (RemoteException re) {
System.out.println(re); }
catch (NotBoundException nbe)
{
System.out.println(nbe);
}
}
}
'
可以编译我的文件,并且RMI注册可以正常工作。问题是每次我收到IllegleArgumentException:argument type mismatch的错误。 你们中的任何人都可以帮助我找出我的代码问题吗?