RMI服务端应用程序:
1、自定义远程接口
代码如下:
- package com.ghj.packageofrmi;
- /**
- * 定义远程接口。
- *
- * @author 高焕杰
- */
- public interface IHelloWordService{
- /**
- * 获取信息
- *
- * @author 高焕杰
- */
- String getMsg();
- }
该接口特点:
a、该接口没有继承java.rmi.Remote接口;
b、该接口中的每个抽象方法没有抛出RemoteException异常或RemoteException 的父类异常;
一句话,该接口和普通Java接口没什么区别。
2、自定义远程接口实现类
代码如下:
- package com.ghj.packageofrmi;
- /**
- * 远程接口实现类。
- *
- * @author 高焕杰
- */
- public class HelloWordService implements IHelloWordService{
- /**
- * 获取信息
- *
- * @author 高焕杰
- */
- public String getMsg(){
- return "Hello World!";
- }
- }
a、该实现类必须实现自定义远程接口内的每个远程抽象方法;
b、该实现类没有继承java.rmi.UnicastRemoteObject类 ;
c、该实现类中默认的构造方法没有显示地写出来,该默认构造方法更没有声明抛出RemoteException异常 ;
d、该实现类也可以含有其它非远程接口定义的抽象方法或非接口方法(即实现类内部自定义的方法,这些方法不能使用@Override进行注释),但客户端不能调用这些新增的方法(别忘了,这些方法并不是自定义远程接口内的抽象方法)。
一句话,该实现类是普通Java实现类没有区别。
3、在xml文件中配置RMI服务端
代码如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <!-- RMI服务端 -->
- <!-- RMI服务端远程接口实现类 -->
- <bean id="helloWordService" class="com.ghj.packageofrmi.HelloWordService" scope="prototype"/>
- <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
- <!-- 将远程接口实现类对象设置到RMI服务中 -->
- <property name="service" ref="helloWordService" />
- <!-- 设置RMI服务名,为RMI客户端依据此服务名获取远程接口实现类对象引用奠定基础 -->
- <property name="serviceName" value="helloWord" />
- <!-- 将远程接口设置为RMI服务接口 -->
- <property name="serviceInterface" value="com.ghj.packageofrmi.IHelloWordService" />
- <!-- 为RMI服务端远程对象注册表设置端口号-->
- <property name="registryPort" value="9090" />
- <!-- 其他属性可以查看org.springframework.remoting.rmi.RmiServiceExporter的类及其子类获取到-->
- </bean>
- </beans>
4、启动RMI服务端
代码如下:
- package com.ghj.packageoftest;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 启动RMI服务端
- *
- * @author 高焕杰
- */
- public class StartRMIServer {
- public static void main(String[] args) {
- new ClassPathXmlApplicationContext("conf/spring/applicationContext.xml");
- System.out.println("RMI服务端启动!!!");
- }
- }
RMI客户端应用程序:
1、自定义包含了RMI服务端自定义远程接口内某些抽象方法的RMI客户端接口
代码如下:
- package com.ghj.packageofrmi;
- /**
- * 自定义包含了RMI服务端自定义远程接口内某些抽象方法的RMI客户端接口
- *
- * @author 高焕杰
- */
- public interface IHelloWord{
- /**
- * 获取信息
- *
- * @author 高焕杰
- */
- String getMsg();
- }
a、该接口的接口名无需和RMI服务端自定义远程接口名称相同;
b、该接口无须继承java.rmi.Remote接口;
c、该接口中需要通过RMI服务端远程对象调用的接口抽象方法需要和RMI服务端一样(这里的“一样”是指接口名、方法名和参数列表一样,注意:这里没有提及方法返回值类型,实验证明,返回值类型可以相同也可以是RMI服务端自定义远程接口相应抽象方法返回值类型的父类,例如该接口中的返回值类型完全可以改为Object ;
d、该接口中的抽象方法无须抛出RemoteException异常;
e、该接口可以包含RMI服务端自定义远程接口内不存在的抽象方法;
f、该接口无须包含RMI服务端自定义远程接口的所有抽象方法;
g、该接口完全可以直接复制RMI服务端自定义远程接口,但从代码精简的角度讲还是只保留需要的抽象接口为好。
2、在xml文件中配置RMI服务端
代码如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <!--RMI客户端-->
- <bean id="rmiProxyFactory" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
- <property name="serviceUrl" value="rmi://localhost:9090/helloWord"/>
- <property name="serviceInterface" value="com.ghj.packageofrmi.IHelloWord"/>
- <!-- 当连接失败时是否刷新远程调用stub -->
- <property name="refreshStubOnConnectFailure" value="true"/>
- </bean>
- </beans>
3、启动RMI客户端
代码如下:
- package com.ghj.packageoftest;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.ghj.packageofrmi.IHelloWord;
- /**
- * 启动RMI客户端
- *
- * @author 高焕杰
- */
- public class RMIClient {
- public static void main(String[] args){
- ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/spring/applicationContext.xml");
- IHelloWord helloWord = (IHelloWord) ctx.getBean("rmiProxyFactory");
- System.out.println(helloWord.getMsg());
- }
- }
从该Java类中可以看出来远程对象地址是通过RMI代理工厂的实例获取的。