昨天想通过一个外部程序操作服务器端的数据,想到了以下方法:
首先想通过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应该可以远程得到这些对象,试试吧~~~