Java:RMI远程调用
首先服务器端定义服务接口和实现服务,然后服务器端利用RMI协议将服务发布到一个端口上。等待客户端调用。
//定义服务接口,服务接口必须继承java.rmi.Remote,服务方法必须抛出java.rmi.RemoteException.
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IRemoteService extends Remote {
public String sayHello(String name) throws RemoteException ;
}
//提供服务实现类,服务实现类继承了java.rmi.server.UnicastRemoteObject,而其构造方法抛出异常,所以服务实现类必须显示给出构造方法并抛出异常.
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RemoteServiceImpl extends UnicastRemoteObject implements IRemoteService {
private static final long serialVersionUID = -1817498005094186816L;
protected RemoteServiceImpl() throws RemoteException { }
public String sayHello(String name) throws RemoteException {
return "Hello " + name + "!";
}
}
//发布服务。也就是将服务实现类注册到RMI服务注册表中。
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class RemotePublish {
public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(8888); // 创建RMI服务注册表
IRemoteService rs = new RemoteServiceImpl();
Naming.bind("rmi://localhost:8888/rservice", rs); // 将服务实现类的实例发布到指定端口并命名为rservice,等待远程调用
}
}
客户端通过RMI协议对发布好的服务器端口进行调用。
import java.rmi.Naming;
public class ClientTest {
public static void main(String[] args) throws Exception {
IRemoteService rs = (IRemoteService) Naming.lookup("rmi://localhost:8888/rservice"); // 从远程获取名称为rservice的服务实现类
String say = rs.sayHello("world");
System.out.println(say);
}
}