发表于: 2019-05-27 22:16:29
1 578
根据教程做了个小demo,看的出来rmi是靠url绑定对象进行数据传输的。
还是不太清楚rmi的运行顺序和机制。
只是知道rmi是通过辅助对象进行访问。
/**
* 客户端程序
*/
public class RmiClient {
public static void main(String[] args){
try {
Rmi rmi = (Rmi) Naming.lookup("rmi://127.0.0.1:8888/Rmi");
System.out.println(rmi);
System.out.println(rmi.sayHello("mmmmmmmmmm"));
} catch (RemoteException | NotBoundException | MalformedURLException e) {
e.printStackTrace();
}
}
}
/**
* 服务器端程序
*/
public class RmiService {
public static void main(String[] args){
org.apache.log4j.Logger logger = Logger.getLogger(RmiService.class);
try {
//创建一个远程对象
Rmi rmi = new RmiServiceImpe();
//远程主机远程对象注册表Registry的实例,并指定端口8888(java默认是1099)
//缺少了注册表创建的话,则无法绑定对象到远程注册表上。
LocateRegistry.createRegistry(8888);
//把远程对象绑定到RMI注册服务器上,并命名
//绑定的URL标准格式为:rmi://host:port/name(协议名可以省略。)
Naming.bind("rmi://127.0.0.1:8888/Rmi",rmi);
// Naming.bind("//localhost:8888/Rmi",rmi);
logger.info("远程对象绑定成功");
//必须捕获这三个异常。
} catch (RemoteException | MalformedURLException | AlreadyBoundException e) {
e.printStackTrace();
}
}
}
spring封装rmi的配置文件
<bean id="RMIServiceImpe" class="service.serivcelmpe.RMIServiceImpe"/>
<!--将一个类发布为rim服务-->
<bean id="myRMIServer" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="Rmi"/><!--这里的Rmi要和客户端的url后面的一样-->
<property name="service" ref="RMIServiceImpe"/>
<property name="serviceInterface" value="service.RmiService"/><!--访问远程服务的类的抽象基类-->
<property name="registryPort" value="8888"/><!--端口要一致-->
</bean>
<!-- 客户端 -->
<bean id="myRMIClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="service.RmiService"/><!--访问远程服务的类的抽象基类-->
<property name="serviceUrl" value="rmi://127.0.0.1:8888/Rmi"/><!--客户端接收这个url里面的值-->
</bean>
虽然能够运行了,但是还是不能理解为什么web下面要放接口,而且controller不能够连自己的service的接口,不然会报错。
按照我的想法是既然controller下有接口那不应该连自己的接口,为什么还只能连service层的接口,但是配置文件里面却可以引controller中service的接口。
明天计划的事:尽快做完
遇到的问题:bug修改中
评论