1 RMI的概念
Java Remote Method Invocation (RMI) is Java's remote procedure call (RPC) mechanism. RMI allows you to write distributed objects using Java.
RMI调用的过程,我的理解大致如下:
- 客户端和服务器端约定好要用于远程调用的方法的接口(包括方法名和输入输出参数)。
- 服务器端将远程服务绑定到某个端口,进行TCP/IP监听(例如监听地址为rmi://127.0.0.1:1099)。
- 客户端与服务器建立TCP/IP连接(当然事先要知道服务器端的监听地址),按照接口声明的方法发送数据(可序列化的Java对象)以及要调用的服务名、方法名等。
- 服务器端将接收到的数据(字节流)反序列化,得到要调用的方法和参数信息;然后服务器端进行本地计算(方法调用)。
- 服务器端将计算的结果(可序列化的Java对象)发送给客户端。
- 客户端从接收到的返回数据(字节流)中进行反序列化,得到运算结果。
- 客户端断开与服务器端的TCP/IP连接,远程调用结束。
2 Spring 配置
Spring --RMI远程方法调用
服务器端配置
(1)首先新建一个j2se项目,添加相关jar
commons-logging-1.1.1.jar ----- 打印日志
spring-2.5.6.SEC02.jar -----解决 异常:java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
spring-aop-2.5.6.jar
spring-beans-2.5.6.SEC02.jar
spring-context-2.5.6.SEC02.jar
spring-context-support-2.5.6.SEC02.jar
spring-core-2.5.6.SEC02.jar
(2)新建一个接口如下:
public interface ILogPerson {
public String getPersion();
public void setPersion(String info);
}
(3)接口实现类:
public class LogPerson implements ILogPerson {
private String delegateinfo;
@Override
public String getPersion() {
return delegateinfo;
}
public void setPersion(String info) {
this.delegateinfo=info;
}
}
(4)添加Spring配置文件 appcontextrmiserver.xml(名字自定义)
<bean id="logPersonService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName">
<value>LogPerson</value>
</property>
<property name="serviceInterface">
<value>com.test.rmi.ILogPerson</value>
</property>
<property name="registryPort">
<value>1200</value>
</property>
</bean>
(5)注册服务(其实就是获取bean)
可以新建一个测试类,在main方法中获取bean信息
public static void main(String[] args) {
//BeanFactory factory=new XmlBeanFactory(new FileSystemResource("appcontextrmiserver.xml"));
//ApplicationContext context = new ClassPathXmlApplicationContext("appcontextrmiserver.xml");
Resource resource = new ClassPathResource("appcontextrmiserver.xml");
BeanFactory factory = new XmlBeanFactory(resource);
factory.getBean("logPersonService");
}
(6)执行main方法,如果看到一下信息 就表示注册成功!
服务器端注册成功::信息: Binding service 'LogPerson' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:
[10.13.122.200:1200](local),objID:[0:0:0, 0]]]]
10.13.122.200 就是当前服务器的ip地址,1200是在xml中配置的注册端口号
客户端调用配置
(1)新建一个j2se项目
(2)将服务器端的接口和接口实现类打成jar文件(或者直接将服务器端接口和接口实现类直接拷到应用中),
添加到应用中,然后添加相关Spring的jar
(3)添加Spring配置
<bean id="LogPerson"class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl">
<value>rmi://10.13.122.193:1200/LogPerson</value>
//对应服务器端IP地址和配置的端口号,LogPerson指服务器端配置的serviceName的value值
</property>
<property name="serviceInterface">
<value>com.test.rmi.ILogPerson</value>
//对应服务器端配置的"serviceInterface"的value值
</property>
</bean>
(4)添加测试类
public class LogPersonRmiClient {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("appcontextrmiserver.xml");
ILogPerson clientLog = (ILogPerson)context.getBean("LogPerson");
clientLog.setPersion("RMI客户端调用!");
}
}
经常出现的异常:
(1)写一个rmi客户端程序,你可能会收到如标题这样的异常。这个问题其实是由rmi服务器端程序造成的。
客户端程序向服务端请求一个对象的时候,返回的stub对象里面包含了服务器的hostname,客户端的后续操作根据这个hostname来连接服务
器端。要想知道这个hostname具体是什么值可以在服务器端bash中打入指令:
hostname -i
如果返回的是127.0.0.1,那么你的客户端肯定会抛如标题的异常了。
解决这个问题有两个方式:
1 修改/etc/hosts
找到127.0.0.1 hostxxxxx这样的字样。把127.0.0.1改成真实的,可供其他机器连接的ip。
这样客户端就能得到真实的ip了
分享到:
相关推荐
Spring RMI配置 在Spring中,配置RMI服务通常涉及以下步骤: - **创建远程接口**:定义一个继承自`java.rmi.Remote`的接口,声明远程方法。 - **实现远程接口**:提供接口的实现,这些方法将在服务器端执行。 - *...
二、Spring RMI配置步骤 1. 创建远程接口:首先定义一个Java接口,声明要远程调用的方法。例如: ```java public interface HelloService { String sayHello(String name); } ``` 2. 实现远程接口:创建接口的实现...
- **`<bean>`标签中的`rmi:`命名空间**:Spring配置文件中可以使用`<rmi:registry>`来定义RMI注册表,`<rmi:export>`用于导出远程服务。 - **`RmiServiceExporter`**:Spring提供的bean,负责将Spring Bean暴露为...
在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring框架来增强RMI的功能,使其更加灵活和易于管理。 首先,我们需要理解Spring框架在RMI中的角色。Spring提供了对RMI的高级抽象,通过其`org.springframework...
通过Spring的RMI支持,我们可以方便地定义服务接口和服务实现,然后通过配置文件或注解将它们暴露为RMI服务。这样做不仅提高了代码的可测试性,也使得服务的部署和管理变得更加灵活。 在原生的Spring RMI实现中,...
3. **配置Spring容器**:在Spring的XML配置文件中,你需要声明一个`<bean>`来表示远程服务,使用`<rmi:export>`或`<bean class="org.springframework.remoting.rmi.RmiServiceExporter">`标签将服务导出为RMI。...
6. **源码分析**:在提供的压缩包文件`SpringRMI`中,可能包含了上述所有步骤的代码示例。通过阅读这些源码,你可以深入理解Spring RMI的工作原理,包括服务暴露、注册、代理创建等。 7. **工具使用**:在开发过程...
3. **Spring配置(Spring Configuration)**:在Spring配置文件中,我们需要声明远程服务bean,并配置RMI服务器和客户端的设置。例如: ```xml <bean id="rmiRegistry" class="org.springframework.remoting.rmi....
下面将详细阐述Spring RMI服务的实现原理、配置过程以及如何自动化发布服务。 首先,了解RMI的基本概念是必要的。RMI是Java提供的一种标准接口,它允许一个Java对象调用远程主机上的另一个Java对象的方法,就像调用...
而 Spring RMI 大大简化了这些步骤,使得开发者可以通过简单的配置来创建 RMI 服务端和客户端。 #### 二、Spring RMI 的安装和使用 Spring 自 1.x 版本起就直接支持 RMI 功能,因此只需要包含 Spring 的 JAR 包...
3. **配置RMI服务器**:在Spring的XML配置文件(如`applicationContext.xml`)中,我们需要配置一个RmiRegistryBean来启动RMI注册表,并声明一个RmiServiceExporter来暴露我们的RMI服务: ```xml ...
Spring RMI(Remote Method Invocation)是Spring框架对Java RMI技术的一种封装,使得在Spring环境中使用RMI变得更加简便。RMI是一种Java平台上的远程对象调用机制,它允许一个Java对象在不同的Java虚拟机之间调用另...
5. **Spring配置**:在Spring的配置文件中,可以使用`<bean>`标签定义RMI服务,并使用`<lookup-method>`标签来查找并注入远程对象。 ```xml <bean id="myServiceExporter" class="org.springframework.remoting...
虽然提供的压缩包子文件名列表`jn`没有提供具体的信息,但可以假设其中可能包含了Spring RMI配置的示例代码、测试用例或其他辅助资源,帮助开发者理解和实践Spring RMI的使用。 总结来说,Spring RMI是Spring框架...
2.4 启动RMI服务器:运行包含上述配置的Spring上下文,服务将自动发布到RMI注册表。 三、创建Spring RMIClient 3.1 引入远程服务:在客户端项目中,同样需要定义远程接口,并确保客户端可以访问服务器端的接口。 ...
具体到这个压缩包“springRMI”,我们可以推测它可能包含了以下几个部分: 1. **配置文件**:如`applicationContext.xml`,其中定义了Spring容器中的Bean,可能包括RMI服务的接口和实现。 2. **远程接口**:`.java`...
配置Spring RMI的基本步骤如下: 1. 定义服务接口和服务实现。 2. 在服务器端,创建一个`RmiServiceExporter`实例,将服务接口和服务实现注入,并配置RMI注册名和端口号。 3. 在服务器端的应用上下文配置文件中,...
Spring RMI在此基础上增加了配置简化、依赖注入等特性,使得远程服务的创建和调用更加便捷。 首先,我们来理解一下Spring RMI的核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,通常...
这个技术基于Java的RMI系统,但通过Spring的抽象层,简化了配置和使用过程,提高了可维护性和可测试性。 在Spring RMI中,主要涉及以下几个关键概念和知识点: 1. **接口定义**:首先,你需要定义一个远程服务接口...