不想再各种查一遍了,写个总结记录
编写被调用的程序
1.创建远程接口RemoteService,继承(extends)java.rmi.Remote,里面的抽象方法抛出java.rmi.RemoteException
2.创建实现类RemoteServiceImpl,继承java.rmi.server.UnicastRemoteObject,实现RemoteService
3.指定通信端口的类,本地调用可省略,远程调用需要指定
import java.rmi.server.*;
import java.io.*;
import java.net.*;
public class RMISocket extends RMISocketFactory {
public Socket createSocket(String host, int port) throws IOException{
return new Socket(host,port);
}
public ServerSocket createServerSocket(int port) throws IOException {
if (port==0) port = 'XXXX';
return new ServerSocket(port);
}
}
XXXX为指定的通信端口号
4.注册程序的类Start.class,代码可直接写在main方法里:
try {
RMISocketFactory.setSocketFactory(new RMISocket());//本地调用可省略
RemoteService service=new RemoteServiceImpl();
Context namingContext=new InitialContext();
namingContext.rebind("rmi://xxx.xx.x.xxx:1099/name", service);
} catch (NamingException e) {
e.printStackTrace();
}
xxx.xx.x.xxx为ip地址,name为注册名称,可自定义,此方法也要抛出java.rmi.RemoteException
注册被调用的程序
打开cmd
1.切换到程序的bin目录下
2.rmic cn.aaa.bbb.RemoteServiceImpl,完成后会在bin目录下生成一个RemoteServiceImpl_Stub.class文件
3.在bin目录下创建mypolicy.policy,内容
grant {
permission java.security.AllPermission "", ""; //"", ""的内容可根据需要自定义
};
4.start rmiregistry(linux下是rmiregistery)
5.java -Djava.security.policy=mypolicy -Djava.ext.dirs=..\lib cn.aaa.bbb.Start
..\lib是被调用程序需要引用的jar目录,没有就不用写
打包被调用的程序
1.eclipse里直接右键export-jar file,其他默认下一步即可
2.将生成的jar file用压缩软件打开,将RemoteServiceImpl_Stub.class文件添加到RemoteServiceImpl同一目录下
编写调用的程序
1.将打包好的jar file添加到程序目录,并build path
2.调用的代码
try{
RemoteService service=(RemoteService)Naming.lookup("rmi://xxx.xx.x.xxx:1099/name");
result=service.method(param);
}catch(Exception e){
e.printStackTrace();
}
注:远程调用,被调用的服务器需要打开端口1099和XXXX