最近在看《java网络编程精解》,第11章中用RMI动态加载类,可怎么试都不成功,求大神解答
我先在C盘下启动了rmiregistry注册表,如果部署成功注册表应该会从codebase指定位置动态加载类
F:\RMIEcho\server\目录下启动了服务器,命令行如下
start java -Djava.rmi.server.code=file:\\\F:\RMIEcho\download\ EchoServer
报异常CommunicationException...,ClassNotFoundException: Echo]...
a.网上说是codebase设置错误,可路径没错呀,之后我又把download目录用tomcat发布到网络上,可还是不行,注册表找不到类文件。
b.在EchoServer中设置了安全策略文件,又报些安全管理器的异常,解决完这些异常,运行到bind又是找不到类,郁闷。。。EchoServer中应该可以不设置安全管理器的吧??貌似客户端需要动态下载类才用设置安全管理器吧???
该启动EchoClient了,可服务端都没建好。。。啊啊啊啊。
我把所有文件放在一个目录下是可以运行的,一分开就崩了。。。就这么点代码改了一晚上都没搞好,睡觉还梦到在改代码,郁闷呀,纯新手,大神们不要鄙视我。。。。
F:\RMIEcho\client\Echo.class
F:\RMIEcho\client\EchoClient.class
F:\RMIEcho\download\Echo.class
F:\RMIEcho\download\EchoImpl.class
F:\RMIEcho\server\EchoServer.class
F:\RMIEcho\server\EchoImpl.class
F:\RMIEcho\server\Echo.class
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EchoServer {
public static void main(String[] args) {
try {
Echo echo = new EchoImpl();
Context namingContext = new InitialContext();
namingContext.bind("rmi:Echo", echo);
System.out.println("服务器注册了一个对象");
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.RMISecurityManager;
import javax.naming.Context;
import javax.naming.InitialContext;
public class EchoClient {
public static void main(String[] args){
String url="rmi://localhost/";
try {
Context namingContext=new InitialContext();
Echo echo=(Echo)namingContext.lookup(url+"echo");
BufferedReader keyborad=new BufferedReader(new InputStreamReader(System
.in));
for(String line=keyborad.readLine();line!=null;line=keyborad.readLine()
){
System.out.println(echo.echo(line));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.rmi.Remote;
import java.rmi.RemoteException;
interface Echo extends Remote {
public String echo(String s)throws RemoteException;
}
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class EchoImpl extends UnicastRemoteObject implements Echo{
EchoImpl()throws RemoteException{}
public String echo(String s){
return "echo:"+s;
}
}
认证高级PHP讲师