RMI-spring RMI固定随机数据端口
RMI 在启动时,会启动两个端口一个是应用端口,就是你的应用指定的端口,另一个是RMI随机分配的数据传输端口。如果LINUX开通了防火墙,必须同时开放这两个端口,才能正常访问服务。可以采用以下方式进行固定随机分配的数据传输端口。该方式只针对sping应用,其他方式暂未尝试。
1 示例
1.1 接口类
新建 BaseService.java
package com.example.springrmifixedport.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* RMI 接口类
* @author Anna.
* @date 2021/4/16 10:50
*/
public interface BaseService extends Remote {
/**
* 测试
* @param name
* @return java.lang.String
* @throws Exception
* @author Anna.
* @date 2021/4/16 10:50
*/
public String test(String name) throws RemoteException;
}
1.2 接口实现类
新建BaseServiceImpl.java
package com.example.springrmifixedport.rmi;
import java.rmi.RemoteException;
/**
* RMI 实现类
*
* @author Anna.
* @date 2021/4/16 10:50
*/
public class BaseServiceImpl implements BaseService {
@Override
public String test(String name) throws RemoteException {
return "hello " + name + " !";
}
}
1.3 配置XML
resources目录新建spring-rmi.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="baseRmiService" class="com.example.springrmifixedport.rmi.BaseServiceImpl"/>
<bean id="baseServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="baseRmiService"></property>
<!-- 配置服务名称-->
<property name="serviceName" value="baseService/test"></property>
<!-- 配置服务接口-->
<property name="serviceInterface" value="com.example.springrmifixedport.rmi.BaseService"></property>
<!-- 配置服务端口-->
<property name="registryPort" value="8082"></property>
<!-- 固定随机分配的通信的端口 -->
<property name="servicePort" value="18082" />
</bean>
</beans>
1.4 启动方法
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-rmi.xml");
BaseService baseService = (BaseService) context.getBean("baseRmiService");
System.out.println("baseRmiServicee start...........");
}
1.5 接口测试
注意:引入BaseService接口类时,必须保证包名与服务一致
public static void main(String[] args) {
String remoteAddr = "rmi://127.0.0.1:8082/baseService/test";
try {
BaseService baseService = (BaseService) Naming.lookup(remoteAddr);
String resp = baseService.test("adsas");
System.out.println(resp);
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
2 demo源码
链接:https://pan.baidu.com/s/170vsXxXThNWBT5TPXN5jAg
提取码:j3np