RMI (Remote Method Invocation)远程方法的简单调用

RMI介绍:JNDI 就是一个注册表,服务端将服务对象放入到注册表中,客户端从注册表中获取服务对象

定义远程接口:
package demo.zookeeper.remoting.common;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*
* @author Administrator
* 2015-4-12
*
* 继承了 Remote 接口,实际上是让 JVM 得知该接口是需要用于远程调用的,
* 抛出了 RemoteException 是为了让调用 RMI 服务的程序捕获这个异常。
* 毕竟远程调用过程中,什么奇怪的事情都会发生(比如:断网)。
* 需要说明的是,RemoteException 是一个“受检异常”,在调用的时候必须使用 try...catch... 自行处理。
*
*/
public interface HelloService extends Remote{

String sayHello(String name)throws RemoteException;

}


编写远程服务方法:
package demo.zookeeper.remoting.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import demo.zookeeper.remoting.common.HelloService;
/**
*
* @author Administrator
* 2015-4-12
*实现以上的 HelloService 是一件非常简单的事情,但需要注意的是,
*我们必须让实现类继承 java.rmi.server.UnicastRemoteObject 类,此外,必须提供一个构造器,
*并且构造器必须抛出 java.rmi.RemoteException 异常。
*我们既然使用 JVM 提供的这套 RMI 框架,那么就必须按照这个要求来实现,
*否则是无法成功发布 RMI 服务的,一句话:我们得按规矩出牌!
*
*
*/
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService{

/**
* @throws RemoteException
*/
public HelloServiceImpl() throws RemoteException {
}

@Override
public String sayHello(String name) throws RemoteException {
// TODO Auto-generated method stub
return String.format("Hello %s!", name);
}

}



注册服务端接口:
package demo.zookeeper.remoting.server;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
/**
*
* @author Administrator
* 2015-4-12
*发布 RMI 服务,我们需要告诉 JNDI 三个基本信息:1. 域名或 IP 地址(host)、2. 端口号(port)、3. 服务名(service),
*它们构成了 RMI 协议的 URL(或称为“RMI 地址”)
*LocateRegistry.createRegistry() 方法在 JNDI 中创建一个注册表,只需提供一个 RMI 端口号即可。
*此外,通过 Naming.rebind() 方法绑定 RMI 地址与 RMI 服务实现类,这里使用了 rebind() 方法
*运行这个 main() 方法,RMI 服务就会自动发布,剩下要做的就是写一个 RMI 客户端来调用已发布的 RMI 服务
*rmi://<host>:<port>/<service> service实际上基于同一host与port下唯一的服务名
*
*/
public class RmiServer {

public static void main(String[] args) throws Exception{
int port=1099;
String url="rmi://localhost:1099/demo.zookeeper.remoting.server.HelloServiceImpl";
LocateRegistry.createRegistry(port);
Naming.rebind(url, new HelloServiceImpl());
}

}



客户端调用:
package demo.zookeeper.remoting.client;
import java.rmi.Naming;
import demo.zookeeper.remoting.common.HelloService;
/**
*
* @author Administrator
* 2015-4-12
* RMI 请求路径、2. RMI 接口(一定不需要 RMI 实现类,否则就是本地调用了)。数行代码就能调用刚才发布的 RMI 服务
*
*
*/
public class RmiClient {

public static void main(String[] args)throws Exception {
String url="rmi://localhost:1099/demo.zookeeper.remoting.server.HelloServiceImpl";
HelloService hello=(HelloService)Naming.lookup(url);
String result=hello.sayHello("zgs!!");
System.out.println(result);
}
}

猜你喜欢

转载自qnzhl.iteye.com/blog/2201725