gpt4 book ai didi

java - RMI 客户端无法查找服务器 - java.rmi.UnmarshalException

转载 作者:行者123 更新时间:2023-12-01 23:04:27 27 4
gpt4 key购买 nike

我有一个 java rmi 服务器和一个 java rmi 客户端在两台独立且不同的机器

服务器基本上是一个斐波那契计算器。它接收一堆数字并根据它们计算斐波那契数列。

客户端只需发送一堆数字供服务器计算即可。

FiboServer 项目由三个类组成:

  • IFibonacci.java:一个接口(interface)
  • Fibonacci.java:实现前面定义的接口(interface)
  • FibonacciServer.java:具有主程序,并运行服务器

FibonacciServer.java:

package fiboserver;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class FibonacciServer {
public static void main(String args[]){

if (System.getSecurityManager() == null) {
System.setProperty("java.security.policy", "server.policy");
System.setSecurityManager(new SecurityManager());
}

try{
IFibonacci fib = new Fibonacci();

// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("fibonacci", fib);

System.out.println("Fibonacci Server ready.");
}catch(RemoteException rex){
System.err.println("Exception in Fibonacci.main " + rex);
}
}
}

客户端项目只有一个类:FibonacciClient.java。

FibonacciClient.java:

package fiboclient;

import fiboserver.IFibonacci;
import java.math.BigInteger;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class FibonacciClient {

public static void main(String[] args) {

if (System.getSecurityManager() == null) {
System.setProperty("java.security.policy", "client.policy");
System.setSecurityManager(new SecurityManager());
}

try{
//args[0] = server Public IP
Registry registry = LocateRegistry.getRegistry(args[0]);
IFibonacci calculator = (IFibonacci) registry.lookup("fibonacci");

//the rest of the args are just numbers to calculate
for(int i = 1; i < args.length; i++){
try{
BigInteger index = new BigInteger(args[i]);
BigInteger f = calculator.getFibonacci(index);

System.out.println("The " + args[i] + "th Fibonacci number "
+ "is " + f);
}catch(NumberFormatException e){
System.err.println(args[i] + " is not an integer.");
}
}
}catch(RemoteException e){
System.err.println("Remote object threw exception " + e);
} catch (NotBoundException e) {
System.err.println("Could not find the requested remote object on "
+ "the server: " + e);
}
}

}

两个项目都有一个策略文件,服务器有一个 server.policy并且客户端有 client.policy文件。两个文件具有相同的内容:

grant{
permission java.security.AllPermission;
};

我正在使用 java -jar FiboServer.jar -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=12.34.56.789 在服务器计算机中启动 FiboServer

我正在使用 java -jar FiboClient.jar 12.34.56.789 1 2 3 4 5 启动客户端.

服务器启动没有问题。但是当我启动客户端时出现错误:

Remote object threw exception java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: fiboserver.IFibonacci

在 StackOverflow 上的搜索让我确信这与 RMI 注册表错误或策略文件错误有关。但是我知道策略文件正在被正确读取,并且我不认为它们有任何错误。

我做错了什么?为什么这不起作用?

<小时/>

编辑:

IFibonacci.java:

package fiboserver;

import java.math.BigInteger;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IFibonacci extends Remote{
public BigInteger getFibonacci(int n) throws RemoteException;
public BigInteger getFibonacci(BigInteger n) throws RemoteException;
}

JAR 文件:

FibonacciClient.jar 的内容:

|META-INF
|----Manifest.mf
|fiboclient
|----FibonacciClient.class

FibonacciServer.jar 的内容:

|META-INF
|----manifest.mf
|fiboserver
|----IFibonacci.class
|----FibonacciServer.class
|----Fibonacci.class

最佳答案

客户端在其类路径上没有异常中指定的类。您需要部署它以及它所依赖的任何类,依此类推,直到关闭。

可能您已将远程接口(interface)重命名/复制到客户端的另一个包中。你不能那样做。服务器和客户端必须相同。相同的名称,相同的方法,相同的包。

注意,您的客户端“远程对象抛出异常”中的消息不正确。可能是lookup() 引发了异常。不要因为假设事情可能并非如此而使自己感到困惑。只需打印实际的错误消息、异常和堆栈跟踪。

关于java - RMI 客户端无法查找服务器 - java.rmi.UnmarshalException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23012293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com