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);
    }
}
posted @ 2018-12-07 09:16  xuejianbest  阅读(806)  评论(0编辑  收藏  举报