`
xiefeifeihu
  • 浏览: 97239 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

提到远程就应该想到RMI

阅读更多

昨天想通过一个外部程序操作服务器端的数据,想到了以下方法:

首先想通过web来做,服务器端是有web接口的,但为了试个小功能写一大堆脚本未免太麻烦。还是先看看有没有其他的方法。

写个main方法,启动一个进程可以吗?一个进程去读另一个进程里的数据显然没那么容易。这就要涉及第三方系统了,比如操作系统的信号量、共享内存,或者是文件、数据库等。这样一来仍然要写一大堆代码,还得对服务器端做较大的改动。这也不是个好方法。

后来一边Google一边想:网络程序不是可以吗,客户端操作服务器端。写Socket?太麻烦了;SOAP?貌似也没那么easy;RMI、RPC适用吗!仔细分析一下发现:客户端只需要发送一些简单的字符串(相当于指令),让服务器执行相应的操作。这和RMI(Java Remote Method Invocation)完全契合。并且有了Spring,RMI的实现也相当简单。

下面开始coding吧,伪代码如下:

首先给远程调用的方法制定一个接口:

public class Oper implements IOper {
    public boolean exeuteMethod(String s) {
        //这里是服务器端要执行的操作
        return true;
    }
}

写一个接口
public interface IOper {
    public boolean exeuteMethod(String s);
}

然后配置服务器端的RMI服务:

 1:  <bean id="oper" class="***.Oper"></bean>
 2:  <bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
 3:      <property name="serviceName">
 4:          <value>mys</value>        
 5:      </property>
 6:      <property name="service">
 7:          <ref local="oper" />
 8:      </property>
 9:      <property name="serviceInterface">
10:          <value>***.IOper</value>
11:      </property>
12:      <property name="registryPort">
13:          <value>9990</value>        
14:      </property>
15:  </bean>

启动服务器端。

下面来配置客户端:

1:  <bean id="rmiClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
2:      <property name="serviceUrl">
3:          <value>rmi://192.168.0.***:9990/mys</value>
4:      </property>
5:      <property name="serviceInterface">
6:          <value>***.IOper</value>
7:      </property>
8:  </bean>

在main里执行远程方法:

1:  public static void main(String[] args) {
2:      ApplicationContext ctx = new ClassPathXmlApplicationContext(
3:              "applicationContext-client.xml");
4:      IOper o = (IOper) ctx.getBean("rmiClient");
5:      System.out.println(o.exeuteMethod("XXXX"));
6:  }

 

运行一下,看看服务器端执行了吧~~~

看样子RMI的应用相当广泛,应该做到“提到远程就应该想到RMI”。

还有什么用途呢。。。

有时候想查看服务器端某对象当前的值,在服务器端打日志是不是挺麻烦,改写代码——上传服务器——重启服务——触发跟踪······多麻烦!我想通过RMI应该可以远程得到这些对象,试试吧~~~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics