使用RMI构建对象代理

时间:2019-05-04 09:00:51

标签: java types casting rmi rpc

我正在使用Java RMI构建对象代理。外部服务器可以在其中注册自己,然后再注册其服务。

还有一个客户端程序,请求执行已注册的方法。这些方法具有不同的名称,不同的参数,不同的参数类型和不同的返回类型。客户端可以执行以下方法:

public String ejecutar_servicio(String nom_servicio, Vector<String> parametros_servicio) throws RemoteException{
    try {
        for(Servidor servidor : servidores){
            for(Servicio servicio : servidor.getServicios){
                if(servicio.getNombre().equals(nom_servicio) && parametros_servicio.size() == servicio.numParametros()){
                    servidor.getNombreRegistrado() server = (servidor.getNombreRegistrado()) Naming.lookup("//" + servidor.getHostname() + "/" + servidor.getNombreRegistrado());
                    return server.nom_servicio(parametros_servicio);
                }
            }
        }
        return "Servicio no encontrado";
    }
    catch (SecurityException ex) {
        return ex.toString();
    }
    catch (NoSuchMethodException ex) {
        return ex.toString();
    }
}

很显然,以前的方法不能像现在一样使用。我想知道一种实现此行为的方法,该方法包括声明仅在运行时才知道的类型的对象,并将其转换为仅在运行时才知道的类型。

这是定义用于注册和保存服务器列表的类:

private class Servidor{
    private String hostname;
    private String nombreRegistrado;
    private List<Servicio> servicios = new ArrayList<>();

    public Servidor(String hostname, String nombreRegistrado){
        this.hostname = hostname;
        this.nombreRegistrado = nombreRegistrado;
    }

    void registrarServicio(Servicio servicio){
        servicios.add(servicio);
    }

    String getNombreRegistrado() {
        return nombreRegistrado;
    }

    List<Servicio> getServicios(){
        return servicios;
    }

    String getHostname(){
        return hostname;
    }
}

这是为其服务定义的类:

private class Servicio{
    private String nombreServicio;
    private Vector listaParametros;
    private String tipoRetorno;

    public Servicio(String nombreServicio, Vector<String> listaParametros, String tipoRetorno){
        this.nombreServicio = nombreServicio;
        this.listaParametros = listaParametros;
        this.tipoRetorno = tipoRetorno;
    }

    public String getNombre(){
        return this.nombreServicio;
    }

    public int numParametros(){
        return this.listaParametros.size();
    }

    public String getTipoRetorno(){
        return this.tipoRetorno;
    }
}

0 个答案:

没有答案