【发布时间】:2012-03-08 15:34:49
【问题描述】:
我正在创建我的第一个非常简单的 RMI 客户端-服务器应用程序。
代码如下:
接口“ICommunication”
package itu.exercies.RMI.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ICommunication extends Remote
{
public String doCommunicate(String name) throws RemoteException;
}
接口实现“CommunicationImpl”:
package itu.exercies.RMI.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class CommunicationImpl extends UnicastRemoteObject implements ICommunication {
/**
*
*/
private static final long serialVersionUID = 1L;
public CommunicationImpl() throws RemoteException {
super();
}
@Override
public String doCommunicate(String name) throws RemoteException {
return "Hello this is server , whats up " +name+ " ?!\n";
}
}
这是我的服务器“CommunicationServer”的主类:
package itu.exercies.RMI.server;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class CommunicationServer {
/**
* @param args
* @throws RemoteException
* @throws MalformedURLException
*/
public static void main(String[] args) throws RemoteException, MalformedURLException {
CommunicationImpl imp = new CommunicationImpl();
Naming.rebind("CommunicationImpl", imp);
System.out.println("Server started...");
System.out.println("Object successfully registered. It is bound to the name 'CommunicationImpl'.");
}
}
这是我的客户“CommunicationClient”:
package itu.exercies.RMI.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import itu.exercies.RMI.server.CommunicationImpl;
public class CommunicationClient {
public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
String url = new String("rmi://localhost/CommunicationImpl");
CommunicationImpl comm = (CommunicationImpl)Naming.lookup(url);
String reply = comm.doCommunicate("Wiktor");
System.out.println(reply);
}
}
现在当我尝试运行它时:
- 我使用终端导航到项目的 bin 目录
- 我从那里运行 rmiregistry
- 我从新的终端窗口运行我的 CommunicationServer(它会打印出消息,因此它似乎可以工作)
- 我打开第三个终端窗口,当我尝试运行我的 CommunicationClient 时,它会引发异常。
线程“main”中的java itu.exercies.RMI.client.CommunicationClientException java.lang.ClassCastException:$Proxy0 无法转换为 itu.exercies.RMI.server.CommunicationImpl 在 itu.exercies.RMI.client.CommunicationClient.main(CommunicationClient.java:14)
到目前为止,我已经尝试通过使用 rmic 创建一个“CommunicationImpl”对象的存根来修复它,但现在错误指的是“CommunicationImpl_Stub”而不是“$Proxy0”:
线程“main”java.lang.ClassCastException 中的异常:itu.exercies.RMI.server.CommunicationImpl_Stub 无法转换为 itu.exercies.RMI.server.CommunicationImpl 在 itu.exercies.RMI.client.CommunicationClient.main(CommunicationClient.java:14)
此时我不知道要查找错误。有人可以给我任何建议吗?
【问题讨论】: