RMI服务器端java.net.MalformedURLException:未知协议:c
我在网上冲浪了两天,但我没有找到解决这个问题的方法,所以我决定在这里提问。 我正在做一个书本练习:“用Java RMI编写一个程序客户端服务器,它返回客户端给定的整数之和。它必须实现一个方法来添加一个整数,并实现一个方法来获取总数”。 我面对的是服务器端 程序返回的错误为:RMI服务器端java.net.MalformedURLException:未知协议:c,java,server,rmi,malformedurlexception,Java,Server,Rmi,Malformedurlexception,我在网上冲浪了两天,但我没有找到解决这个问题的方法,所以我决定在这里提问。 我正在做一个书本练习:“用Java RMI编写一个程序客户端服务器,它返回客户端给定的整数之和。它必须实现一个方法来添加一个整数,并实现一个方法来获取总数”。 我面对的是服务器端 程序返回的错误为: java.rmi.UnmarshalException: Error unmarshaling return; nested exception is: java.net.MalformedURLException: un
java.rmi.UnmarshalException: Error unmarshaling return; nested exception is:
java.net.MalformedURLException: unknown protocol: c
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at java.rmi.Naming.bind(Unknown Source)
at ContatoreServer.main(ContatoreServer.java:15)
Caused by: java.net.MalformedURLException: unknown protocol: c
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at sun.rmi.server.LoaderHandler.pathToURLs(Unknown Source)
at sun.rmi.server.LoaderHandler.getDefaultCodebaseURLs(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
... 5 more
远程接口
public interface IContatore extends Remote{
int get() throws RemoteException;
void add(int i) throws RemoteException;
}
远程对象
public class ContatoreLocale {
private int num;
public ContatoreLocale(){
this.num=0;
}
public synchronized int get(){
return this.num;
}
public synchronized void add(int i){
this.num+=i;
}
}
public class ContatoreRemoto extends ContatoreLocale implements IContatore{
Logger log= Logger.getLogger("global");
//Costruttore
public ContatoreRemoto() throws RemoteException{
super();
UnicastRemoteObject.exportObject(this, 0);
try {
Naming.rebind("Contatore", this);
//errore
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public int get(String nome) throws RemoteException{
return this.get();
}
public void add(String nome,int i) throws RemoteException{
this.add(i);
}
}
服务器
public class ContatoreServer {
static Logger log= Logger.getLogger("global");
public static void main(String[] args) {
try {
ContatoreRemoto cr=new ContatoreRemoto();
log.info("Server Pronto");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
请帮助我:根据我的经验,这与放置RMI Eclipse项目的文件系统中的绝对路径有关。我想你可能有一个空白,一个空间,在道路上。因此RMI无法解析路径,路径被中断。。。然后我们得到“畸形”异常。它可能靠近一个“c”,因此,在异常中会出现“c”。 我建议您转到文件系统,导航到项目文件夹,并检查项目的绝对路径。我打赌你有一张空白的。 例如c:\Users\mylab c\MyProjects。。。。
你注意到空白了吗?这可能有帮助:感谢评论“AcururCrunGoo”,我将RMIGRUNE作为Eclipse中的一个外部工具启动,所以我不知道如何管理你提出的解决方案“代码> NAMG.RADIN())/Cuth>需要一个URL,而不仅仅是一个名称。您需要
“//localhost/Contatore”
,或者至少“Contatore”
Naming.rebind()
抛出异常,并且不使用文件系统路径。