Rmi远程调用

不想再各种查一遍了,写个总结记录

编写被调用的程序

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


你可能感兴趣的:(java)