RMI 客户端 com.sun.proxy.Proxy 无法转换错误
RMI client com.sun.proxy.Proxy cannot be cast error
服务器:
package server;
import java.rmi.*;
public interface iCSServer extends Remote
{
public int Findnumber(int num) throws RemoteException;
}
package server;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
和
public class CSServer extends UnicastRemoteObject implements iCSServer {
private static final long serialVersionUID = 01; // version 01
int N=1000; // number of ids
int[] Ids=new int[N]; // data structure for storing the Ids
public CSServer() throws RemoteException
{
}
public void Add_Ids() // add ids to data
{
for(int i=0;i<N;i++)
{
Ids[i]=i+ (i+1)*10;
}
}
public int Findnumber(int num) throws RemoteException
{
for(int i=0;i<N;i++)
{
if(num==Ids[i])
{
return i;
}
}
return -1;
}
public static void main(String[] args) throws RemoteException {
System.setProperty("java.rmi.server.hostname","127.0.0.1");
LocateRegistry.createRegistry(1099);
// System.out.println(LocateRegistry.getRegistry(1099).toString());
CSServer obj=new CSServer();
obj.Add_Ids();
try {
Naming.rebind ("CSServer", obj);
System.out.println ("CS218 Server is running.");
}
catch (Exception e) {
System.out.println ("CS218 server cannot run: " + e);
}
}
}
服务器启动,运行没问题。
客户:
package client;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.*;
public interface iCSServer extends Remote
{
public int Findnumber(int num) throws RemoteException;
}
和
package client;
import java.rmi.Naming;
import java.rmi.registry.*;
public class clientApp {
public static void main(String[] args)
{
try{
iCSServer obj = (iCSServer) Naming.lookup("//localhost:1099/CSServer");
//Registry registry = LocateRegistry.getRegistry("127.0.0.1");
//iCSServer obj=(iCSServer) registry.lookup("CSServer");
System.out.println("pass");
System.out.println(obj.Findnumber(100));
}
catch(Exception ex)
{
System.out.println("fail");
System.out.println(ex.getMessage());
}
}
}
然而,当我 运行 客户端时,我得到这个错误:
fail
error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: server.iCSServer (no security manager: RMI class loader disabled)
然后我添加了 server.ICSServer 的 jar 版本,我相信这解决了这个问题。然而,我再次 运行 它,现在我得到这个错误:
fail
com.sun.proxy.$Proxy0 cannot be cast to client.iCSServer
关于如何解决的任何想法?
您已通过将其放入不同的程序包来重命名该界面。必须一样。
服务器:
package server;
import java.rmi.*;
public interface iCSServer extends Remote
{
public int Findnumber(int num) throws RemoteException;
}
package server;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
和
public class CSServer extends UnicastRemoteObject implements iCSServer {
private static final long serialVersionUID = 01; // version 01
int N=1000; // number of ids
int[] Ids=new int[N]; // data structure for storing the Ids
public CSServer() throws RemoteException
{
}
public void Add_Ids() // add ids to data
{
for(int i=0;i<N;i++)
{
Ids[i]=i+ (i+1)*10;
}
}
public int Findnumber(int num) throws RemoteException
{
for(int i=0;i<N;i++)
{
if(num==Ids[i])
{
return i;
}
}
return -1;
}
public static void main(String[] args) throws RemoteException {
System.setProperty("java.rmi.server.hostname","127.0.0.1");
LocateRegistry.createRegistry(1099);
// System.out.println(LocateRegistry.getRegistry(1099).toString());
CSServer obj=new CSServer();
obj.Add_Ids();
try {
Naming.rebind ("CSServer", obj);
System.out.println ("CS218 Server is running.");
}
catch (Exception e) {
System.out.println ("CS218 server cannot run: " + e);
}
}
}
服务器启动,运行没问题。
客户:
package client;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.*;
public interface iCSServer extends Remote
{
public int Findnumber(int num) throws RemoteException;
}
和
package client;
import java.rmi.Naming;
import java.rmi.registry.*;
public class clientApp {
public static void main(String[] args)
{
try{
iCSServer obj = (iCSServer) Naming.lookup("//localhost:1099/CSServer");
//Registry registry = LocateRegistry.getRegistry("127.0.0.1");
//iCSServer obj=(iCSServer) registry.lookup("CSServer");
System.out.println("pass");
System.out.println(obj.Findnumber(100));
}
catch(Exception ex)
{
System.out.println("fail");
System.out.println(ex.getMessage());
}
}
}
然而,当我 运行 客户端时,我得到这个错误:
fail
error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: server.iCSServer (no security manager: RMI class loader disabled)
然后我添加了 server.ICSServer 的 jar 版本,我相信这解决了这个问题。然而,我再次 运行 它,现在我得到这个错误:
fail
com.sun.proxy.$Proxy0 cannot be cast to client.iCSServer
关于如何解决的任何想法?
您已通过将其放入不同的程序包来重命名该界面。必须一样。