java RMI 注册服务

本文介绍了如何使用Java RMI构建一个RPC服务。关键点包括:定义继承自Remote接口的通用服务接口,利用UnicastRemoteObject创建并导出远程对象,以及编写服务端和客户端代码来实现远程方法调用。

如何使用java RMI 包实现一个RPC

1.需要使用到的两个类:

java.rmi.server.UnicastRemoteObject类和java.rmi.Remote接口

1.Remote接口

源代码:

/**
 * The <code>Remote</code> interface serves to identify interfaces whose
 * methods may be invoked from a non-local virtual machine. 
 *  */
public interface Remote {}

Remote 接口用来确定一些接口,这些接口的方法将被远端虚拟机调用。

在远端客户端和本地的服务之间需要定义一个接口,这个接口将被作为通用接口来提供客户端使用。而这个通用的接口需要继承于Remote接口。

public interface RMIQueryStatus extends Remote {

    String getStatus() throws RemoteException;
}
2.UnicastRemoteObject类

源代码:

/**
 * Used for exporting a remote object with JRMP and obtaining a stub
 * that communicates to the remote object. 
 **/
public class UnicastRemoteObject extends RemoteServer {

}

UnicastRemoteObject类用来提供一个带有java远程方法协议的对象,并且还保留一个与远端对象交流的存根。
源代码:

    protected UnicastRemoteObject(int port) throws RemoteException
    {
        this.port = port;
        exportObject((Remote) this, port);
    }

UnicastRemoteObject对象就是最终需要new的对象,它需要继承与Remote接口,并且new了这个对象后,会有一个后台的进程。远端的客户端调用的也是这个对象的方法。

public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus {

    protected RMIQueryStatusImpl() throws RemoteException {
        super();
    }
    @Override
    public String getStatus() throws RemoteException {
        return "yes";
    }

}
2.本地服务端代码和远端客户端代码

服务端:

public class RpcServer {

    public static final String RMI_URI = "rmi://10.12.40.60:16290/query";

    public static void main(String[] args) {

        try {
            RMIQueryStatusImpl queryservice = new RMIQueryStatusImpl();
            LocateRegistry.createRegistry(16290);
            Naming.rebind(RMI_URI, queryservice);
            System.out.println("Server ready!");
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}

客户端:

public class RpcClient {

    public static final String RMI_URI = "rmi://10.12.40.60:16290/query";

    public static void main(String[] args) {

        try {
            RMIQueryStatus query = (RMIQueryStatus) Naming.lookup(RMI_URI);
            String s = query.getStatus();
            System.out.println("Client get value: " + s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值