-
[郑州|结业弟子]JAVA-何爽0
应该是RMI端口的问题:
RMI之所以使用的范围受限制主要有两方面原因,其一:必须要是java,平台的异构性受到限制;其二:穿越防火墙不方便。这里主要谈谈RMI如何通过固定分配端口来穿越防火墙。
RMI穿越防火墙不方便主要是因为除了RMI服务注册的端口(默认1099)外,与RMI的通讯还需要另外的端口来传送数据,而另外的端口是随机分配的,所以要想RMI的客户能通过防火墙来与RMI服务通讯,
第一种方法:
需要能让随机分配的端口固定下来,具体做法如下:
如果是spring+rmi,可以通过spring bean方式来指定两个端口,但是tuscany不行,需要自己写类来完成。
通过比对spring 的指定端口的源码发现
<bean id = "rmiService" class = "org.springframework.remoting.rmi.RmiRegistryFactoryBean" >
在这个类里
通过这个接口配置服务器相关配置
在RMIServerSocketFactory里 发现设置端口的接口,
继承它的实现,并重写
public class SMRMISocket extends RMISocketFactory {
private static Logger logger = LoggerFactory.getLogger(SMRMISocket.class);
@Override
public Socket createSocket(String host, int port) throws IOException {
return new Socket(host,port);
}
@Override
public ServerSocket createServerSocket(int port) throws IOException {
if (port == 0) {
port = 8089; //不指定就随机分配了
logger.info("port服务端端口号:" + port);
}
logger.info("服务端端口号:" + port);
return new ServerSocket(port);
}
}在main里调用:
RMISocketFactory.setSocketFactory(new SMRMISocket());
这样的话RMI分配的端口就被固定了,防火墙只需要打开1099和8089端口即可。
第二种方法:
在阿里云中开放所有的端口,这样不管rmi传送数据的是哪个端口都可以通过,要开放全端口应填:1/65535
编辑于2018-10-12
- 去第 页