以下内容的sample source 放在 https://github.com/zl86790/download/blob/master/java_rmi_sample.zip
Speaker
package name.lizhe.inter;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Speaker extends Remote {
public String sayHello(String name) throws RemoteException;
}
SpeakerImpl
package name.lizhe.impl;
import java.io.Serializable;
import java.rmi.RemoteException;
import name.lizhe.inter.Speaker;
public class AppleSpeaker implements Speaker,Serializable {
@Override
public String sayHello(String name) throws RemoteException {
return "hello "+name;
}
}
server启动类
package name.lizhe.exe;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Scanner;
import name.lizhe.impl.AppleSpeaker;
import name.lizhe.inter.Speaker;
public class Executor {
public static void main(String args[]) throws RemoteException, MalformedURLException, AlreadyBoundException{
Speaker speaker = new AppleSpeaker();
LocateRegistry.createRegistry(8888);
Naming.bind("rmi://127.0.0.1:8888/speaker", speaker);
Scanner sc = new Scanner(System.in);
sc.nextLine();
}
}
client
package name.lizhe.exe;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import name.lizhe.inter.Speaker;
public class Client {
public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
Speaker speaker = (Speaker) Naming.lookup("rmi://127.0.0.1:8888/speaker");
System.out.println(speaker.sayHello("world"));
}
}
下面是spring版本
不过很奇怪的是一开始我使用4.2.2版本, 会出现
java.lang.NoClassDefFoundError: org/springframework/expression/ParserContext
换成4.1.6版本之后消失了
新建两个maven项目, pom的内容都一样
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sprmiclient</groupId>
<artifactId>sprmiclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring-version>4.1.6.RELEASE</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
</project>
然后主要的interface 和impl文件和上面的一样
server project 的 applicationContext.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="appleSpeakerImpl" class="name.lizhe.impl.AppleSpeaker"> </bean>
<bean id="myRMIServer" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="speaker"></property>
<property name="service" ref="appleSpeakerImpl"></property>
<property name="serviceInterface" value="name.lizhe.inter.Speaker"></property>
<property name="registryPort" value="8888"></property>
</bean>
</beans>
然后启动文件为
package name.lizhe.exe;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Executor {
public static void main(String args[]){
new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
spring容器会自己阻塞,所以不需要scanner了
启动server项目之后会看到

然后是client project
applicationContext内容是
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="speakerClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="name.lizhe.inter.Speaker"></property>
<property name="serviceUrl" value="rmi://127.0.0.1:8888/speaker"></property>
</bean>
</beans>
启动文件为
package name.lizhe;
import java.rmi.RemoteException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import name.lizhe.inter.Speaker;
public class SpeakerClient {
public static void main(String[] args) throws RemoteException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Speaker speaker = applicationContext.getBean("speakerClient",Speaker.class);
System.out.println(speaker.sayHello("world"));
}
}
启动client项目之后
