在项目中使用rmi,发布到linux,unix,由于开了防火墙。需要配置防火墙端口。刚开始配置了一个固定端口,死都连接不通,后来同netstat -antup |grep pid 查看进程监听的端口,,发现原来rmi有2个端口一个是固定的。一个是随机的。
RMI之所以使用的范围受限制主要有两方面原因,其一:必须要是java,平台的异构性受到限制;其二:穿越防火墙不方便。这里主要谈谈RMI如何通过固定分配端口来穿越防火墙。 RMI穿越防火墙不方便主要是因为除了RMI服务注册的端口(默认1099)外,与RMI的通讯还需要另外的端口来传送数据,而另外的端口是随机分配的,所以要想RMI的客户能通过防火墙来与RMI服务通讯,则需要能让随机分配的端口固定下来,具体做法如下:
1、增加一个文件SMRMISocket.java
- import java.rmi.server.*;
- import java.io.*;
- import java.net.*;
- publicclass SMRMISocket extends RMISocketFactory {
- public Socket createSocket(String host, int port) throws IOException{
- returnnew Socket(host,port);
- }
- public ServerSocket createServerSocket(int port) throws IOException {
- if (port == 0)
- port = 10990; //不指定就随机分配了
- returnnew ServerSocket(port);
- }
- }
import java.rmi.server.*;
import java.io.*;
import java.net.*;
public class SMRMISocket extends RMISocketFactory {
public Socket createSocket(String host, int port) throws IOException{
return new Socket(host,port);
}
public ServerSocket createServerSocket(int port) throws IOException {
if (port == 0)
port = 10990; //不指定就随机分配了
return new ServerSocket(port);
}
}
2、在实例化UnicastRemoteObject的子类前加入一下代码:
- try {
- RMISocketFactory.setSocketFactory(new SMRMISocket());
- } catch (Exception ex) {
- }