如何快速学习JavaRMI

如何快速学习JavaRMI,java,ipc,rmi,Java,Ipc,Rmi,我有一个Java应用程序,我已经开发了一两年了。我想创建一组非常简单的接口(以后可能会增加复杂性),我可以使用这些接口从另一个JVM(例如MATLAB)控制我的Java应用程序 我认为RMI是最好的方法,但我不确定,因为我对它几乎一无所知 快速学习RMI的最佳方法是什么? 假设我想使用这样的接口: interface Application { public void setLoggingEnabled(boolean enable); public boolean isLoggin

我有一个Java应用程序,我已经开发了一两年了。我想创建一组非常简单的接口(以后可能会增加复杂性),我可以使用这些接口从另一个JVM(例如MATLAB)控制我的Java应用程序

我认为RMI是最好的方法,但我不确定,因为我对它几乎一无所知

快速学习RMI的最佳方法是什么?

假设我想使用这样的接口:

interface Application {
   public void setLoggingEnabled(boolean enable);
   public boolean isLoggingEnabled();
}

我如何使用RMI通过这个接口实现两个JVM之间的桥接?我必须知道什么是阻塞/线程化/同步,才能使这项工作正常进行?

好的链接开始:

RMI指南:

RMI教程:


你可以从官方开始


资源:

关于同一主题:


正如Yok和Colin所说,请阅读Oracle(Sun)支持的RMI教程,在阅读时尝试编写示例代码并在示例项目中测试它们

工具书类
  • RMI教程:

    • 一种快速的方法是使用弹簧。这并不(必然)意味着要使用大量XML配置:Spring的RMI支持类可以通过编程方式使用

      这两个主要类别是:

      • 使对象可远程访问
      • 访问远程对象
      这样做的一个优点是,您只需要编写接口的实现,然后就可以使用
      RmiServiceExporter
      使用它。同时,在客户端,使用
      RmiProxyFactoryBean
      可以为您提供一个实现接口的代理对象。就客户端代码而言,它使用的是接口的“真实”实现,但代理为您执行RMI调用。RMI的使用是透明的

      作为一个例子,我刚刚使用您的界面编写了一个服务器和客户机

      我对接口的实现是:

      public class ApplicationImpl implements Application {
      
          private boolean enable;
      
          @Override
          public void setLoggingEnabled(boolean enable) {
              this.enable = enable;
          }
      
          @Override
          public boolean isLoggingEnabled() {
              return enable;
          }
      
      }
      
      服务器端代码为:

      RmiServiceExporter exporter = new RmiServiceExporter();
      exporter.setService(new ApplicationImpl());
      exporter.setServiceInterface(Application.class);
      exporter.setServiceName("application");
      exporter.afterPropertiesSet();
      
      RmiProxyFactoryBean pfb = new RmiProxyFactoryBean();
      pfb.setServiceInterface(Application.class);
      pfb.setServiceUrl("rmi://localhost/application");
      pfb.afterPropertiesSet();
      Application app = (Application) pfb.getObject();
      
      System.out.println(app.isLoggingEnabled());
      app.setLoggingEnabled(true);
      System.out.println(app.isLoggingEnabled());
      
      客户端代码为:

      RmiServiceExporter exporter = new RmiServiceExporter();
      exporter.setService(new ApplicationImpl());
      exporter.setServiceInterface(Application.class);
      exporter.setServiceName("application");
      exporter.afterPropertiesSet();
      
      RmiProxyFactoryBean pfb = new RmiProxyFactoryBean();
      pfb.setServiceInterface(Application.class);
      pfb.setServiceUrl("rmi://localhost/application");
      pfb.afterPropertiesSet();
      Application app = (Application) pfb.getObject();
      
      System.out.println(app.isLoggingEnabled());
      app.setLoggingEnabled(true);
      System.out.println(app.isLoggingEnabled());
      
      哪些是预期产出:

      false
      true
      

      很酷,谢谢你提供的细节。不确定我是否想使用Spring而不是普通的RMI(不确定依赖开销),但它给了我一些想法。我建议在第一个项目中避免回调,也就是说,保持单向通信。让服务器能够启动与客户机的通信确实很诱人,但一旦引入防火墙,就很难管理(尤其是在严格控制的环境中)。不是说回调有什么问题,只是说在单向通信正确之前不要使用它们。+1对于RMI指南,其中包括规范和常见问题解答,我想我现在已经掌握了基本知识,谢谢!谢天谢地,第二个链接断了。当官方文档可用时,使用第三方资源是不必要或不可取的。