1

我一直在学习 RMI,我从 Hello World 程序开始,我开始工作,然后开始使用其他所有工作的示例程序。(嗯,有错误,但我在 google/stackoverflow 的帮助下调试了它们)。现在我开始编写我自己的项目,它基本上是一个旅行推销员的实现,将繁重的计算卸载到服务器上。

一切工作正常,突然我所有的服务器 RMI 实现都崩溃了。IE。当我从 Eclipse 运行 computeEngine 作为 RMI 应用程序(我使用 RMI 插件)时,我收到以下错误:

java.rmi.ConnectException: Connection refused to host 

或错误:

java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFException

我有 4-5 个不同的 RMI 应用程序都在工作,然后突然之间,我在服务器上运行的“ComputeEngine.java”文件开始为我的每个应用程序返回这两个错误之一。

注意:因为我正在测试这些应用程序,所以我使用“localhost”作为我的服务器主机名。换句话说,服务器和客户端是同一台机器。

我尝试过的事情:

  1. 我检查了我的 etc/hosts/ 文件,发现 127.0.0.1 设置为 localhost。我还创建了一台名为“虚拟机”的新机器,并使用了我的公共 IP 地址。两者都没有工作。
  2. 我已经两次和三次检查了我的 server.policy 和 client.policy 文件,看起来都很好。
  3. 我尝试从终端运行 RMI 应用程序(而不是使用 Eclipse 中的 RMI 插件),我得到了同样的错误
  4. 我退出了所有 java 进程并重新运行所有内容,确保我首先启动了服务器(其他线程建议这些错误来自首先运行客户端)
  5. 我已经对自己进行了端口扫描,并且在我运行服务器时端口 1099(默认的 rmi 端口)说“LISTEN”(即使服务器返回异常)。
  6. 我尝试更改 java.rmi.server.hostname,但到目前为止似乎没有任何帮助。

当我在同一台计算机上同时运行服务器和客户端时,我不明白如何无法连接到主机。

我先发制人地道歉,因为我对 RMI 和 Java 很糟糕,并且错过了一些可能显而易见的解决方案。

我应该包含我一直试图运行的任何源代码吗?

编辑:这是堆栈跟踪:

ComputeEngine exception:
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 
    java.io.EOFException
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:227)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at engine.ComputeEngine.main(ComputeEngine.java:33)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:267)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:213)
    ... 3 more

谢谢你!

编辑2:

我注意到,如果我在启动应用程序时重新启动了 RMIregistry(例如,我在 Eclipse RMI 插件中选择了重新启动 rmiregistry 的选项),我会在我的“codebase.jar”中得到一个 ClassNotFoundError。

Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: compute.Compute

有任何想法吗?

4

0 回答 0