首页 > java运用RMI框架类的动态加载不成功

java运用RMI框架类的动态加载不成功

最近在看《java网络编程精解》,第11章中用RMI动态加载类,可怎么试都不成功,求大神解答

1.

我先在C盘下启动了rmiregistry注册表,如果部署成功注册表应该会从codebase指定位置动态加载类

2.

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中应该可以不设置安全管理器的吧??貌似客户端需要动态下载类才用设置安全管理器吧???

3.

该启动EchoClient了,可服务端都没建好。。。啊啊啊啊。

ps

我把所有文件放在一个目录下是可以运行的,一分开就崩了。。。就这么点代码改了一晚上都没搞好,睡觉还梦到在改代码,郁闷呀,纯新手,大神们不要鄙视我。。。。

文件结构

client

F:\RMIEcho\client\Echo.class
F:\RMIEcho\client\EchoClient.class

download

F:\RMIEcho\download\Echo.class
F:\RMIEcho\download\EchoImpl.class

server

F:\RMIEcho\server\EchoServer.class
F:\RMIEcho\server\EchoImpl.class
F:\RMIEcho\server\Echo.class

代码

EchoServer.java

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();
        }   
    }
}

EchoClient.java

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();
        }
    }
}

Echo.java

import java.rmi.Remote;
import java.rmi.RemoteException;
interface Echo extends Remote {
    public String echo(String s)throws RemoteException;
}

EchoImpl.java

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;
    }
}
【热门文章】
【热门文章】